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。
注:推荐使用https的默认端口443,如果使用其他端口,需要进行额外的配置,本文不对此类情况进行说明 。
3.2 配置文件详解
3.2.1 nginx.conf 文件
#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;
}
}
}
3.2.2 server.xml 文件
用户工程若部署在 Tomcat 中,需参考本节内容修改server.xml文件,若不是,可忽略本节内容。
修改%tomcat_home%\conf\server.xml,在 Engine 模块下配置一个 Valve :
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"
protocolHeaderHttpsValue="https"/>
4. 注意事项
4.1 模板无法预览,处于刷新状态
问题描述
用户将 JAR 包从 2019-04-03 升级到 2019-05-29 后,任意模板无法正常预览,一直处于刷新状态,但 Nginx 配置了 38888 端口后,可正常预览。
原因分析
埋点时 38888 端口没被转发 (非集群)导致的。
解决方案
用户需在 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 无线网络登录页面空白
问题描述
集群环境下有线网络可正常登录,无线网络登录页面空白,但是节点可以正常登录。
原因分析
Nginx 无权限读取数据流,报错日志信息如下图所示:
解决方案
修改 nginx.conf 中的用户组配置,如下图所示: