V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
37Y37
V2EX  ›  Blogger

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

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

    文章列举了几个 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   ·   实用小工具   ·   5408 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:27 · PVG 15:27 · LAX 23:27 · JFK 02:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.