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”,如果制定为*,那么所有的;

以上指令可在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: 阅读数据时间
      最大阅读数据时间
  • 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 请求,然后根据返回的结果判断是否允许跨域请求,所以这里单独判断这个请求,然后直接返回;

参考

重试机制: 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

XFS
原文地址:https://www.cnblogs.com/xiaofengshan/p/14966409.html