虽然是常用的 Nginx 配置,但你可能并不完全知道 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
37Y37
V2EX    Blogger

虽然是常用的 Nginx 配置,但你可能并不完全知道

  •  
  •   37Y37 2019-05-08 23:19:45 +08:00 2941 次点击
    这是一个创建于 2415 天前的主题,其中的信息可能已经有所发展或是发生改变。

    文章列举了几个 Nginx 常见的,实用的,有趣的配置,希望看过之后能说一句:学到了!

    一个站点配置多个域名

    server { listen 80; server_name ops-coffee.cn b.ops-coffee.cn; } 

    server_name 后跟多个域名即可,多个域名之间用空格分隔

    一个服务配置多个站点

    server { listen 80; server_name a.ops-coffee.cn; location / { root /home/project/pa; index index.html; } } server { listen 80; server_name ops-coffee.cn b.ops-coffee.cn; location / { root /home/project/pb; index index.html; } } server { listen 80; server_name c.ops-coffee.cn; location / { root /home/project/pc; index index.html; } } 

    基于 Nginx 虚拟主机配置实现,Nginx 有三种类型的虚拟主机

    基于 IP 的虚拟主机: 需要你的服务器上有多个地址,每个站点对应不同的地址,这种方式使用的比较少

    基于端口的虚拟主机: 每个站点对应不同的端口,访问的时候使用 ip:port 的方式访问,可以修改 listen 的端口来使用

    基于域名的虚拟主机: 使用最广的方式,上边例子中就是用了基于域名的虚拟主机,前提条件是你有多个域名分别对应每个站点,server_name 填写不同的域名即可

    nginx 添加账号密码验证

    server { location / { auth_basic "please input user&passwd"; auth_basic_user_file key/auth.key; } } 

    有很多服务通过 nginx 访问,但本身没有提供账号认证的功能,就可以通过 nginx 提供的 authbase 账号密码认证来实现,可以用以下脚本来生成账号的密码

    # cat pwd.pl #!/usr/bin/perl use strict; my $pw=$ARGV[0] ; print crypt($pw,$pw)."\n"; 

    使用方法:

    # perl pwd.pl ops-coffee.cn opf8BImqCAXww # echo "admin:opf8BImqCAXww" > key/auth.key 

    nginx 开启列目录

    当你想让 nginx 作为文件下载服务器存在时,需要开启 nginx 列目录

    server { location download { autoindex on; autoindex_exact_size off; autoindex_localtime on; } } 

    autoindex_exact_size: 为 on(默认)时显示文件的确切大小,单位是 byte ;改为 off 显示文件大概大小,单位 KB 或 MB 或 GB

    autoindex_localtime: 为 off(默认)时显示的文件时间为 GMT 时间;改为 on 后,显示的文件时间为服务器时间

    默认当访问列出的 txt 等文件时会在浏览器上显示文件的内容,如果你先让浏览器直接下载,加上下边的配置

    if ($request_filename ~* ^.*?\.(txt|pdf|jpg|png)$) { add_header Content-Disposition 'attachment'; } 

    配置默认站点

    server { listen 80 default; } 

    当一个 nginx 服务上创建了多个虚拟主机时默认会从上到下查找,如果匹配不到虚拟主机则会返回第一个虚拟主机的内容,如果你想指定一个默认站点时,可以将这个站点的虚拟主机放在配置文件中第一个虚拟主机的位置,或者在这个站点的虚拟主机上配置 listen default

    不允许通过 IP 访问

    server { listen 80 default; server_name _; return 404; } 

    可能有一些未备案的域名或者你不希望的域名将服务器地址指向了你的服务器,这时候就会对你的站点造成一定的影响,需要禁止 IP 或未配置的域名访问,我们利用上边所说的 default 规则,将默认流量都转到 404 去

    上边这个方法比较粗暴,当然你也可以配置下所有未配置的地址访问时直接 301 重定向到你的网站去,也能为你的网站带来一定的流量

    server { rewrite ^/(.*)$ https://ops-coffee.cn/$1 permanent; } 

    直接返回验证文件

    location = /XDFyle6tNA.txt { default_type text/plain; return 200 'd6296a84657eb275c05c31b10924f6ea'; } 

    很多时候微信等程序都需要我们放一个 txt 的文件到项目里以验证项目归属,我们可以直接通过上边这种方式修改 nginx 即可,无需真正的把文件给放到服务器上

    nginx 配置 upstream 反向代理

    http { ... upstream tomcats { server 192.168.106.176 weight=1; server 192.168.106.177 weight=1; } server { location /ops-coffee/ { proxy_pass http://tomcats; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } } 

    稍不注意可能会落入一个proxy_pass加杠不加杠的陷阱,这里详细说下proxy_pass http://tomcatsproxy_pass http://tomcats/的区别:

    虽然只是一个 /的区别但结果确千差万别。分为以下两种情况:

    1. 目标地址中不带 uri (proxy_pass http://tomcats)。此时新的目标 url 中,匹配的 uri 部分不做修改,原来是什么就是什么。
    location /ops-coffee/ { proxy_pass http://192.168.106.135:8181; } http://domain/ops-coffee/ --> http://192.168.106.135:8181/ops-coffee/ http://domain/ops-coffee/action/abc --> http://192.168.106.135:8181/ops-coffee/action/abc 
    1. 目标地址中带 uri (proxy_pass http://tomcats/,/也是 uri ),此时新的目标 url 中,匹配的 uri 部分将会被修改为该参数中的 uri。
    location /ops-coffee/ { proxy_pass http://192.168.106.135:8181/; } http://domain/ops-coffee/ --> http://192.168.106.135:8181 http://domain/ops-coffee/action/abc --> http://192.168.106.135:8181/action/abc 

    nginx upstream 开启 keepalive

    upstream tomcat { server ops-coffee.cn:8080; keepalive 1024; } server { location / { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://tomcat; } } 

    nginx 在项目中大多数情况下会作为反向代理使用,例如 nginx 后接 tomcat,nginx 后接 php 等,这时我们开启 nginx 和后端服务之间的 keepalive 能够减少频繁创建 TCP 连接造成的资源消耗,配置如上

    keepalive: 指定每个 nginxworker 可以保持的最大连接数量为 1024,默认不设置,即 nginx 作为 client 时 keepalive 未生效

    proxy_http_version 1.1: 开启 keepalive 要求 HTTP 协议版本为 HTTP 1.1

    proxy_set_header Connection "": 为了兼容老的协议以及防止 http 头中有Connection close导致的 keepalive 失效,这里需要及时清掉 HTTP 头部的 Connection

    404 自动跳转到首页

    server { location / { error_page 404 = @ops-coffee; } location @ops-coffee { rewrite .* / permanent; } } 

    网站出现 404 页面不是特别友好,我们可以通过上边的配置在出现 404 之后给自动跳转到首页去


    相关文章推荐阅读:

    7 条回复    2019-06-06 20:35:06 +08:00
    testsec
        1
    testsec  
       2019-05-09 13:01:23 +08:00 via iPhone
    不错很实用,收藏了
    37Y37
        2
    37Y37  
    OP
       2019-05-09 13:13:29 +08:00
    @testsec 这么多收藏的就你给回复了下,感动哭
    xyqhkr
        3
    xyqhkr  
       2019-05-09 14:04:19 +08:00
    有用
    mmdsun
        4
    mmdsun  
       2019-05-09 20:13:51 +08:00 via Android
    感谢分享。
    37Y37
        5
    37Y37  
    OP
       2019-05-09 22:22:11 +08:00
    @xyqhkr 看到隔壁帖子发了个带公众号的文章被喷成狗,我这瑟瑟发抖,幸亏没被带歪,感谢!
    37Y37
        6
    37Y37  
    OP
       2019-05-09 22:22:34 +08:00
    @mmdsun 感谢支持。
    37Y37
        7
    37Y37  
    OP
       2019-06-06 20:35:06+08:00
    写了另一篇 Nginx 配置文章欢迎阅读:Nginx 与安全有关的几个配置
    https://mp.weixin.qq.com/s/D6PeQ_lzcaY8pmOLqTY-gQ
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1095 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 18:06 PVG 02:06 LAX 10:06 JFK 13:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86