nginx简单配置
简介
Nginx代码完全用C语言从头写成,是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
下载
windows版本
链接:https://pan.baidu.com/s/1H4n1c5B-ow7979czQUgxgQ
提取码:eyk2
官方文档: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream
反向代理配置
在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。
首先是location进行的是模糊匹配
- 没有“/”时,location /abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi等;
- 而有“/”时,location /abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求。
下面四种情况分别用http://luxingda.top/py/test 进行访问。
- 第一种
location /py/ {
proxy_pass http://127.0.0.1:5000/;
}
结论:会被代理到http://127.0.0.1:5000/test 这个url
- 第二种(相对于第一种,最后少一个 /)
location /py/ {
proxy_pass http://127.0.0.1:5000
; }
结论:会被代理到http://127.0.0.1:5000/py/test这个url
- 第三种
location /py/ {
proxy_pass http://127.0.0.1:5000/py/;
}
结论:会被代理到http://127.0.0.1:5000/py/test这个url。
- 第四种(相对于第三种,最后少一个 / )
location /py/ {
proxy_pass http://127.0.0.1:5000/py;
}
结论:会被代理到http://127.0.0.1:5000/pytest这个url
替换模块 ngx_http_sub_module
- 使用范围
XmlHttpRequest同源策略、页面静态资源访问地址替换。 - 配置
执行:nging -V 命令,检查其是否有ngx_http_sub_module模块。若有,则不需安装,否则需要单独安装改模块,本文提供的nginx是已经安装好了该模块。
location /py/ {
proxy_pass http://127.0.0.1:5000/py;
add_header Access-Control-Allow-Origin *;##允许跨域
sub_filter 'http://p.qiao.baidu.com' 'https://www.demo.com';##将响应内容中的域名替换成本站域名
sub_filter_once on;####所有匹配到的都替换
}
- 常用指令
- sub_filter指令: sub_filter string(原字符串) replacement(用于替换的字符串);
用于设置需要使用说明字符串替换说明字符串.string是要被替换的字符串,replacement是 新的字符串,它里面可以带变量。 - sub_filter_last_modified指令: sub_filter_last_modified on | off;
用于设置网页内替换后是否修改 可在nginx.conf的 http, server, location三个位置配置使 用,默认值是off; - sub_filter_once指令:sub_filter_once on | off;
用于设置字符串替换次数,默认只替换一次。如果是on,默认只替换第一次匹配到的到字 符,如果是off,那么所有匹配到的字符都会被替换; - sub_filter_types指令:sub_filter_types *
用于指定需要被替换的MIME类型,默认为“text/html”,如果制定为*,那么所有的;
- sub_filter指令: sub_filter string(原字符串) replacement(用于替换的字符串);
以上指令可在nginx.conf的http, server, location三个位置配置使用;
此模块替换不区分大小写;
支持中文替换。
多个过滤模块配置要1.9以上才支持。
负载均衡配置
upstream tomcats {
server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15 max_conns=1000;
server 192.168.0.101:8080 down;
server example.com:8080 backup;
}
server {
listen 80;
location / {
proxy_pass http://tomcats;
proxy_next_upstream error timeout http_503 http_500 non_idempotent;
proxy_connect_timeout 1s;
proxy_read_timeout 20s;
proxy_send_timeout 20s;
}
}
- 常用指令
- weight: 访问权重
默认为1,将请求平均分配给每台server - max_fails: 失败次数
默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。 - fail_timeout:失败时间
默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它。 - backup 备份机
所有服务器挂了之后才会生效 - down
标识某一台server不可用。可能能通过某些参数动态的激活它吧,要不真没啥用。 - max_conns
限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。 - proxy_next_upstream 重试机制
出现该错误,则去访问下一个服务器 - proxy_connect_timeout:连接时间
最大连接时间 - proxy_send_timeout: 发送数据时间
最大发送数据时间 - proxy_read_timeout: 阅读数据时间
最大阅读数据时间
- weight: 访问权重
- nginx 的错误编码
proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
Default: proxy_next_upstream error timeout;
Context: http, server, location
指定应将请求传递到下一个服务器的情况:
error # 与服务器建立连接,向其传递请求或读取响应头时发生错误;
timeout # 在与服务器建立连接,向其传递请求或读取响应头时发生超时;
invalid_header # 服务器返回空的或无效的响应;
http_500 # 服务器返回代码为500的响应;
http_502 # 服务器返回代码为502的响应;
http_503 # 服务器返回代码为503的响应;
http_504 # 服务器返回代码504的响应;
http_403 # 服务器返回代码为403的响应;
http_404 # 服务器返回代码为404的响应;
http_429 # 服务器返回代码为429的响应(1.11.13);
non_idempotent # 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求;
off # 禁用将请求传递给下一个服务器。
跨越配置
location /aoda-web {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
}
- 常用指令
- Access-Control-Allow-Origin,这里使用变量 $http_origin取得当前来源域,大家说用“*”代表允许所有,我实际使用并不成功,原因未知;
- Access-Control-Allow-Credentials,为 true 的时候指请求时可带上Cookie,自己按情况配置吧;
- Access-Control-Allow-Methods,OPTIONS一定要有的,另外一般也就GET和POST,如果你有其它的也可加进去;
- Access-Control-Allow-Headers,这个要注意,里面一定要包含自定义的http头字段(就是说前端请求接口时,如果在http头里加了自定义的字段,这里配置一定要写上相应的字段),从上面可看到我写的比较长,我在网上搜索一些常用的写进去了,里面有“web-token”和“app-token”,这个是我项目里前端请求时设置的,所以我在这里要写上;
- Access-Control-Expose-Headers,可不设置,看网上大致意思是默认只能获返回头的6个基本字段,要获取其它额外的,先在这设置才能获取它;
- 语句“ if ($request_method = 'OPTIONS') { ”,因为浏览器判断是否允许跨域时会先往后端发一个 options 请求,然后根据返回的结果判断是否允许跨域请求,所以这里单独判断这个请求,然后直接返回;
常用命令
cmd 进入Nginx解压目录 执行以下命令
-
start nginx
:启动nginx服务 -
nginx -s reload
:修改配置后重新加载生效 -
nginx -s reopen
:重新打开日志文件 -
nginx -t
:验证配置是否正确
出现:
则说明配置正确
-
nginx -V
:查看Nginx的版本号 -
start nginx
:启动Nginx -
nginx -s stop
:快速停止或关闭Nginx -
nginx -s quit
:正常停止或关闭Nginx -
nginx -s reload
:配置文件修改重装载命令
参考
重试机制: https://www.cnblogs.com/cyleon/p/11023229.html
https://blog.csdn.net/goodlook0123/article/details/83344821
https://zhuanlan.zhihu.com/p/35803906
https://blog.csdn.net/qq_34556414/article/details/106312024
负载均衡: https://blog.csdn.net/xyang81/article/details/51702900
连接超时: https://blog.aliasmee.com/post/questions-about-proxy-connect-timeout-on-nginx/
反向代理:https://www.cnblogs.com/luxd/p/12097097.html
静态资源访问链接替代:https://www.cnblogs.com/kenwar/p/8296508.html
跨越请求参考:https://blog.csdn.net/envon123/article/details/83270277
https://www.cnblogs.com/hookjc/p/13179029.html