安装
root@oldsix:/data/nginx/conf/config.d# nerdctl run -d -p 80:80 \
-p 443:443 \
--name mynginx \
--net=host \
-v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/conf:/etc/nginx \
-v /data/nginx/logs:/var/log/nginx \
nginx
37358645e312d4d42fbce1d1aea1097cc8a20c9b8a850c6ea3cc0c287c7e2936
root@oldsix:/data/nginx/conf/config.d# nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37358645e312 docker.io/library/nginx:latest "/docker-entrypoint.…" 2 seconds ago Up 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp mynginx
root@oldsix:/data/nginx/logs# netstat -nplt|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 54694/nginx: master
配置文件
root@oldsix:/data/nginx/logs# cat ../conf/nginx.conf
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log debug;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
# 定义 HTTP 服务器
http {
# 包含 MIME 类型的文件
include /etc/nginx/mime.types;
# 默认 MIME 类型
default_type application/octet-stream;
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent -- $args';
access_log /var/log/nginx/caoyong-access.log ;
# 自定义的 Nginx 配置
server {
# 监听的端口
listen 80;
# 服务器名称
#server_name localhost;
location / {
# 网站根目录,此处使用容器内的路径
root /usr/share/nginx/html;
# 默认首页
index index.html;
# 尝试从磁盘找到请求的文件,如果不存在则跳转到 index.html
try_files $uri $uri/ /index.html;
}
location /moli {
autoindex on;
if ($arg_path = "india"){
rewrite /moli/(.*)$ /$1 break;
proxy_pass http://india.knowdee.com;
}
if ($arg_path = "us"){
rewrite /moli/(.*)$ /$1 break;
proxy_pass http://moli-us.knowdee.com;
}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 600s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 定义 404 页面
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
# 定义 50x 页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
# 四层负载均衡,为三台Master apiserver组件提供负载均衡
#stream {
# log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
# access_log /var/log/nginx/k8s-access.log main;
# upstream k8s-apiserver {
# server 172.70.21.11:6443;
# server 172.70.21.12:6443;
# server 172.70.21.13:6443;
# }
#
# server {
# listen 16443; # 由于nginx与master节点复用,这个监听端口不能是6443,否则会冲突
# proxy_pass k8s-apiserver;
# }
#}
按url请求参数代理
- location进行路径 最常见的是通过location进行路径匹配的时候,但是没办法使用正则表达一起捕获这个路径和querstring的参数。如果我们想通过URL里面的Query String进行不同的rewrite,应该如何处理呢?答案就是query_string 与query_string;比如&p=2887&q=test 如果想要在nginx里面单独访问这些变量。可以这样 比如arg_p arg可以精确匹配变量,比如说我有一个参数(uri里?后面的那部分全叫参数):&p=你大爷&q=你大娘,用query_string和arg_p就是可以获取“你大爷”。
- rewrite: 需求用到rewrite 其中有一个是要把a.php?id=2重定向到b-2.html 开始简单的写为 rewrite "^/a(.)?(.)2.html permanent;
ingress 可以实现系统的功能
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
meta.helm.sh/release-name: app
meta.helm.sh/release-namespace: moli-us
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($http_path = "us") {
proxy_pass http://app.moli-us;
break;
}
if ($http_path = "india") {
proxy_pass http://app.moli-india;
break;
}
labels:
app.kubernetes.io/instance: app
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: app
app.kubernetes.io/version: 2.0.0
helm.sh/chart: app-0.0.3
helm.toolkit.fluxcd.io/name: app
helm.toolkit.fluxcd.io/namespace: moli-us
name: app
namespace: moli-us
spec:
ingressClassName: nginx
rules:
- host: moli-us.knowdee.com
http:
paths:
- backend:
service:
name: app
port:
number: 80
path: /
pathType: ImplementationSpecific
Nginx配置中last和break及permanent和redirect的区别
一、不写last和break
流程就是依次执行这些rewrite
- rewrite break - url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变
- rewrite last - url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变
- rewrite redirect – 返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)
- rewrite permanent – 返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url
二、使用last会对server标签重新发起请求
- 如果location中rewrite后是对静态资源的请求,不需要再进行其他匹配,一般要使用break或不写,直接使用当前location中的数据源,完成本次请求
- 如果location中rewrite后,还需要进行其他处理,如动态fastcgi请求(.PHP,.jsp)等,要用last继续发起新的请求
(根的location使用last比较好, 因为如果有.php等fastcgi请求还要继续处理) - 使用alias指定源:必须使用last
三、last和break总结
- 当出现在location之外时,两者的作用是一致的没有任何差异。
注意一点就是,他们会跳过所有在他们之后的rewrite模块中的指令,去选择自己匹配的location
Example:
rewrite url1 url2 last; ①
rewrite url3 url4 last; ②
rewrite url5 url6 last; ③
location ~ url2 ④
location ~ url4 ⑤
location ~ url6 ⑥
当① 这条rewrite 规则生效后,它后面的②和③ 将被跳过不做判断,而去直接选择 后面的location。
- last和break当出现在location内部时,两者就存在了差异
last: 使用了last指令,rewrite后会跳出location作用域,重新开始再走一次刚刚的行为
break: 使用了break指令,rewrite后不会跳出location 作用域。它的生命也在这个location中终结。
Example:
rewrite xxx1 yyy last; ⑦
rewrite xxx2 yyy last; ⑧
rewrite xxx3 yyy last; ⑨
rewrite xxx4 yyy last; ⑩
location ~ url1
{
rewrite url1 url2 last; ①
}
location ~ url2
{
rewrite url3 url4 break; ②
fastcgi_pass 127.0.0.1:9000;
}
以上事例说明:
第一个location中的rewrite指令处理完成之后,会跳出location,再重新判断rewrite 7 ~ 9的规则。
第二个location中的rewrite指令处理完成之后,不会跳出location,更不会重新判断rewrite 7 ~ 9的规则。而只能将信息传递给后面的fastcgi_pass或者proxy_pass等指令。
四、permanent和redirect总结
permanent: 大家公认的信息,永久性重定向。请求日志中的状态码为301
redirect:大家公认的信息,临时重定向。请求日志中的状态码为302
从实现功能的角度上去看,permanent 和 redirect 是一样的。不存在哪里好,哪里坏。也不存在什么性能上的问题。
但从SEO(或者是百度爬你的网站时)。 类似于这样的东西,会对你到底是永久性重定向还是临时重定向感兴趣。