nginx.conf 配置手册

  • 文档创建者:Vic.zhang
  • 编辑次数:17次
  • 最近更新:Roxy 于 2020-04-21
  • 1. 概述

    1.1 问题描述

    Nginx 部署后,需要修改 nginx.conf 文件才能使用。

    1.2 解决思路

    本文提供了两种配置方式:

    • 通用配置,常规即 HTTP 情况下只需要更改 IP 和端口即可使用。

    • HTTPS 负载均衡,需要一些配置的其他要求。

    2. HTTP(常用配置)

    2.1 Nginx 通用配置文件

    Nginx通用配置:nginx-通用版.conf

    下载后修改文件内节点 IP 和端口,重命名为 nginx.conf,然后替换原始的/usr/nginx/conf/nginx.conf

    2.2 配置文件详解

    #用户或者用户组 默认为nobody
    #user  root;
    #允许进程数量,建议设置为cpu核心数或者auto自动检测,注意Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个
    worker_processes  auto;
    #自动根据CPU数目绑定CPU亲缘性,nginx1.9.10及以上版本才能用
    #worker_cpu_affinity  auto;
    #error日志存放位置
    error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    #PID存放位置
    #pid        logs/nginx.pid;
    #工作模式及连接数上限
    events {
        #每个worker_processes的最大连接数,Windows服务器无论这里设置多大实际都只有1024
        #并发数是 worker_processes 和 worker_connections 的乘积
        worker_connections  1024;
    }
    http {
        #设定mime类型,类型由mime.type文件定义
        include       mime.types;
        #默认文件类型,默认为text/plain
        default_type  application/octet-stream;
        #日志格式
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" $upstream_addr';
        #access_log确定了Nginx是否保存访问日志,将这个设置为关闭可以降低磁盘IO而提升速度
        access_log  off;
        #access_log  logs/access.log  main;
        #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
        #对于普通应用,必须设为 on,
        #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
        #以平衡磁盘与网络I/O处理速度,降低系统的uptime.

        sendfile        on;
        #tcp_nopush     on;
        #http长连接(client <-> nginx)超时时间,请求完成之后连接保持的时间
        keepalive_timeout  65s;
        #types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升
        types_hash_max_size 2048;
        #开启gzip压缩
        #gzip  on;
        #gzip_disable "MSIE [1-6].";
        #设定请求缓冲
        client_header_buffer_size    512k;
        large_client_header_buffers  4 512k;
        #允许用户最大上传数据大小,根据业务需求调整上传文件大小限制
        client_max_body_size 100M;
         
        upstream FR.com {
            #max_fails=n fail_timeout=m 表示m时间内超时n次失败尝试,将会在接下来m时间内标记此节点不可用(m时间过后无论此节点是否启动都会被重新标记为可用状态)
            #其中fails为“失败尝试”,失败尝试由下面server配置中,proxy_next_upstream指令定义
            server 10.120.133.95:8075 max_fails=15 fail_timeout=300s;
            server 10.120.133.96:8075 max_fails=15 fail_timeout=300s;
            keepalive 300; 
            #其它server参数说明:
            #down 标记服务器挂掉
            #backup 备份服务器,当主服务器(例如上面的95和96)不可用时才加入服务器;
            #weight=number 权重,默认为1
            #内置负载均衡策略有ip hash、轮询、加权轮询(设置server的weight值)
            #ip_hash;
                  #↓====================主动健康检查模块配置====================↓#
            ## interval:向后端发送的健康检查包的间隔,单位ms。
            ## fall(fall_count): 如果连续失败次数达到fall_count,服务器就被认为是down
            ## rise(rise_count): 如果连续成功次数达到rise_count,服务器就被认为是up。
            ## timeout: 后端健康请求的超时时间,单位ms。
            ## type:健康检查包的类型,现在支持tcp、udp、http类型
            #check interval=2000 rise=5 fall=10 timeout=10000 type=http;
            # 检查请求, 7-16之前的persist版本,只能使用 /webroot/decision/system/info HTTP;
            #check_http_send "GET /webroot/decision/system/health HTTP/1.0\r\n\r\n"; # 检查请求
            #check_http_expect_alive http_2xx http_3xx; #该指令指定HTTP回复的成功状态,默认认为2XX和3XX的状态是健康的。
            #↑====================主动健康检查模块配置====================↑#

        }
        upstream WBS.com { 
            server 10.120.133.95:38888 max_fails=15 fail_timeout=300s;
        server 10.120.133.96:38888 max_fails=15 fail_timeout=300s;
            #这里必须使用ip_hash
        ip_hash;
        }
        server {
            listen       80;
            server_name  localhost;
            #nginx默认不转发带下划线的header,比如请求的header中有_device_这个header,转发到负载服务器时默认会丢弃
            #可以在http或者http -> server这两个上下文中加入一条属性

            underscores_in_headers on;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            #↓====================主动健康检查模块监测页面====================↓#
            #location /status {
            #    healthcheck_status html;
            #}
            #↑====================主动健康检查模块监测页面====================↑#
            #根/下的请求默认转发到的位置,即端口后面跟的请求全部转发到如下反向代理
            location / {
                #对于HTTP代理,proxy_http_version指令应该设置为“1.1”,同时“Connection”头的值也应被清空(如下proxy_set_header Connection "")
                proxy_http_version 1.1;
                #定义转发到的服务器(组)
                proxy_pass http://FR.com;
                #设置nginx转发时转发到下一个服务器的条件,此处设置将未成功请求(proxy_next_upstream定义的40x, 50x等)传递到下一步进行处理
                # 失败尝试说明:50x和429在此配置会被当作fail,error,timeout并 invalid_header无论配置与否都被认为fail,http_403 and http_404配置与否都不是fail。
                # error:与后端服务器建立连接、传递请求、读取请求头发生的错误
                # timeout:与后端服务器建立连接、传递请求、读取请求头超时,设置在proxy_next_upstream_timeout和proxy_next_upstream_tries(默认值都是0)
                # invalid_header:服务器返回非法或者为空
                proxy_next_upstream http_500 http_502 http_503 http_504 http_403 http_404 http_429 error timeout invalid_header non_idempotent;
                #proxy_next_upstream_timeout 0;
                #proxy_next_upstream_tries 0;
                #重定向,参数off将在这个字段中禁止所有的proxy_redirect指令
                proxy_redirect off;
                #请求头的一些设置,语法proxy_set_header [field] [value];
                #$host为请求的主机名称(即nginx代理服务器), $server_port为主机端口(即nginx端口),如果有外网映射,这里应改写 外网地址:外网端口 形式(不要带协议)
                proxy_set_header Host $host:$server_port;
                #这里$remote_addr客户端ip地址
                proxy_set_header X-Real-IP $remote_addr;
                #这里$proxy_add_x_forwarded_for是代理层级,如果由多层代理,这里就写client,proxy1,proxy2,这里应该是client即客户端ip
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                #与后端服务器的连接不需要保持
            proxy_set_header Connection "";
                #NGINX会缓冲来自代理服务器的响应。响应存储在内部缓冲区中,并且在收到整个响应之前不会发送到客户端。
                #缓冲有助于优化慢客户端的性能,如果响应从NGINX同步传递到客户端,则会浪费代理服务器时间。
                #但是,当启用缓冲时,NGINX允许代理服务器快速处理响应,而NGINX将响应存储的时间与客户端下载它们所需的时间相同
                #是否开启缓冲,默认开启
                #proxy_buffering off;
                #设置缓冲区的大小为size
                #proxy_buffer_size     64k;
                #每个连接设置缓冲区的数量和大小,proxy_buffers [number] [size];
                #proxy_buffers         32 64k;
                #当开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值
                #proxy_busy_buffers_size 64k;
                #连接到代理服务器超时时间,默认60s,不能超过75s
                #不宜太长或者太短,配合max_fails和fail_timeout设置
                #并发量高的情况下,服务器压力过大时容易出现超时,可以考虑max_fails和fail_timeout设置大一点,减少nginx错误踢出节点的几率
                proxy_connect_timeout    75;
                #读取超时,默认60s,如果在超时时间内服务器未返回任何数据,视为超时。如果没有大数据量计算或导出的模板,则建议配置不超过100s,如果有大数据量计算或导出的模板,则根据最长耗时的模板时间进行配置。
                proxy_read_timeout       400;
                #写入超时,默认60s,如果在超时时间内服务器未收到数据表示超时,视为超时。如果没有大数据量计算或导出的模板,则建议配置不超过100s,如果有大数据量计算或导出的模板,则根据最长耗时的模板时间进行配置。
                proxy_send_timeout       400;
            }
            #定义404页面
            #error_page  404              /404.html;
            # redirect server error pages to the static page /50x.html
            #定义50x页面
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
        server {  
            #此处为websocket端口,如果是集群部署,FineReport工程为38889,FineBI工程为48889
            listen 38889;              
        server_name localhost;
            location / { 
                 proxy_http_version 1.1;
                 proxy_pass http://WBS.com;
                 proxy_connect_timeout 75;
                 proxy_read_timeout 400;
                 proxy_send_timeout 400;
                 
                 #升级目标为$http_upgrade 值实际为websocket
         proxy_set_header Upgrade $http_upgrade;
                 #Connection设置升级
         proxy_set_header Connection "upgrade";
                 }
            }
    }

    3. HTTPS

    3.1 配置要求

    要求 https 的负载均衡(不限于 Nginx)的配置符合如下几项要求:

    1)443 监听,而且转发到后端只能是从 443 进来的请求;

    2)Tomcat 或者其它服务器容器不做任何ssl配置;

    3)负载均衡监听 http 的 80 端口并重定向到 https443 端口;

    4)WebSocket 只需要做 38889/48889(FineReport 工程为 38889,FineBI 工程为 48889)的 SSL 监听;

    5)负载均衡转发到 Tomcat 前要设置请求头的 X-Forwarded-Proto 值为 https。

    3.2 配置文件详解

    #user  root;
    ...
    省略部分参考http配置文件
    ...
        worker_connections  1024;
    }


    http {
         #add_header access-control-allow-Origin *;
         add_header access-control-allow-Headers X-Requested-With;
         add_header access-control-allow-Methods GET,POST,OPTIONS;
         include       mime.types;
    省略..
         
        upstream FR.com {
    省略..     
        }

        upstream WBS.com { 
    省略..   
        }

        server {
            listen       80;
            server_name  192.168.5.232;
            underscores_in_headers on;
            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                rewrite ^(.*)$  https://$server_name$1 permanent;
                }

            #error_page  404              /404.html;

            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }

        server {  
            #FineReport工程为38889,FineBI工程为48889     
            listen       38889 ssl;
    server_name  192.168.5.232;

            ssl_certificate      /mnt/hgfs/share/keys/server.crt;
            ssl_certificate_key  /mnt/hgfs/share/keys/server.key;

            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;

            #ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
            ssl_prefer_server_ciphers  on;
            location / {
                proxy_request_buffering off;
                proxy_buffering off;
                proxy_connect_timeout 75;
                proxy_read_timeout 400;
                proxy_send_timeout 400;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";

                proxy_pass http://WBS.com;
             }
        }
        server {
            listen       443 ssl;
            server_name  192.168.5.232;

        #ssl on;
            ssl_certificate      /mnt/hgfs/share/keys/server.crt;
            ssl_certificate_key  /mnt/hgfs/share/keys/server.key;

            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;

            ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
            ssl_prefer_server_ciphers  on;

        #fastcgi_param HTTPS on; #attention!#


            location / {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                
                proxy_buffering off;
                proxy_next_upstream http_500 http_502 http_503 http_504 http_403 http_404 http_429 error timeout invalid_header non_idempotent;

                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                # 把 https 的协议告知 Tomcat,否则 Tomcat 可能认为是 http 的请求
                proxy_set_header X-Forwarded-Proto $scheme;
            
                proxy_connect_timeout    75;
                proxy_read_timeout       400;
                proxy_send_timeout       400;

                proxy_pass http://FR.com;
            }
        }
    }

    4. 注意事项

    4.1 案例一

    4.1.1 问题现象

    用户将 JAR 包从 2019.04.03 升级到 2019.05.29 后,任意模板无法正常预览,一直处于刷新状态,但 Nginx 配置了 38888 端口后,可正常预览。

    4.1.2 原因分析

    埋点时 38888 端口没被转发 (非集群)导致的。

    4.1.3 解决方案

    用户需在 Nginx 中代理 38888 端口,监听 38888 端口,对请求中有 socket.io 的进行转发,代码如下所示:

     server {     
      listen 38888;      
      server_name 域名;
      location /socket.io/ {             
             proxy_pass http://ip:38888;          
            proxy_connect_timeout 20;          
            proxy_read_timeout 1000;        
             proxy_send_timeout 300;       
             proxy_http_version 1.1;         
             proxy_set_header Upgrade $http_upgrade;      
            proxy_set_header Connection "upgrade";    
           }      
        } 

    4.2 案例二

    4.2.1 问题现象

    集群环境下有线网络可正常登录,无线网络登录页面空白,但是节点可以正常登录。

    4.2.2 原因分析

    Nginx 无权限读取数据流,报错日志信息如下图所示:

    1.png

    4.2.3 解决方案

    修改 nginx.conf 中的用户组配置,如下图所示:

    2.png

    附件列表


    主题: 部署集成
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!