1. Install
1.1. Windows
start nginx.exe
tasklist /fi "imagename eq nginx.exe"
nginx.exe -s quit # 完整有序终止
nginx.exe -s stop # 强行终止,貌似不好用
nginx.exe -s reload # 重载配置文件
taskkill /f /t /im nginx.exe # 强行关闭所有进程
1.2. CentOS
# 添加 yum 源CentOS6
rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# 添加 yum 源CentOS7
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 在线安装
yum install nginx
# 启动服务
service nginx start # CentOS6
systemctl restart nginx # CentOS7
# 查看版本
nginx -V
# 检测配置文件是否正确,会告诉你配置文件的位置/etc/nginx/nginx.conf
nginx -t
1.3. Ubuntu
sudo apt-get install gcc
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g-dev
sudo apt-get install openssl libssl-dev
sudo apt-get install make
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gzip_static_module \
--with-stream \
--with-stream_ssl_module
sudo make
sudo make install
# validate the config file.
sudo /usr/local/nginx/sbin/nginx -t
# reload the config file.
sudo /usr/local/nginx/sbin/nginx -s reload
# start nginx server.
sudo /usr/local/nginx/sbin/nginx
1.4. Install on Debian
# 在线安装
apt-get install nginx
# 启动服务
service nginx start
1.5. 编译安装
准备源代码: http://nginx.org/en/download.html
参考文档:http://nginx.org/en/docs/configure.html
https://www.openssl.org/source/
下载最新版本的openssl-fips包
tar -xvf openssl-fips-2.0.16.tar.gz
cd openssl-fips-2.0.16
./config
make
make install
编译安装
tar -xvf nginx-1.14.0.tar.gz
cd nginx-1.14.0
# 简单编译
./configure --with-pcre=../pcre-8.42 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-fips-2.0.16
# 启用stream模块, 支持tcp的转发功能.
./configure --with-stream=dynamic --with-pcre=../pcre-8.42 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-fips-2.0.16
./configure --with-stream=dynamic --with-pcre=../pcre-8.43 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-fips-2.0.16
make
make install
# 验证配置文件
/usr/local/nginx/sbin/nginx -t
# 修改配置文件
/usr/local/nginx/conf/nginx.conf
# 启动程序
/usr/local/nginx/sbin/nginx
# 重启程序
/usr/local/nginx/sbin/nginx -s reload
2. config file
vi /usr/local/nginx/conf/nginx.conf
2.1. forward sftp stream
stream {
upstream server1 {
hash $remote_addr consistent;
server 10.18.20.1:8050 max_fails=3 fail_timeout=60s;
}
upstream server2 {
hash $remote_addr consistent;
server 10.18.20.2:8050 max_fails=3 fail_timeout=60s;
}
server {
listen 1022;
proxy_connect_timeout 60s;
proxy_timeout 3s;
proxy_pass server1;
}
server {
listen 2022;
proxy_connect_timeout 60s;
proxy_timeout 3s;
proxy_pass server2;
}
}
“proxy_timeout”这个参数可以写在stream节点下,所有server都生效,也可以单独写在一个server的节点下。参数不写的话,默认连接超时是10min,如果10分钟没有任何动作的话,你的连接socket就会被干掉,因此这里要配置的时间可以根据自己的实际业务需要来配比如10s。
2.2. 中诚信托VPN转发配置
[[user]] nobody;
worker_processes 1;
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream sftp {
hash $remote_addr consistent;
server 10.18.20.3:8050 max_fails=3 fail_timeout=60s;
}
server {
listen 8022;
proxy_connect_timeout 15s;
proxy_timeout 15s;
proxy_pass sftp;
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://10.18.20.3;
}
}
}
2.3. 配置SSL
准备好公钥和私钥,然后按照如下配置即可。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/nginx/www.aoye.info.pem;
ssl_certificate_key /etc/nginx/www.aoye.info.key;
server_name aoye.info www.aoye.info;
root /opt/www;
index index.html index.htm index.nginx-debian.html;
location / {
}
}
2.4. location 指定静态目录
配置在server节点中,其中http://ip/web1 访问的是/opt/web1 目录下的文件。
location /web1 {
root /opt;
}
2.5. location 指定多个地址
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _;
ssl_certificate "/etc/nginx/fss.rexen.com.cn.pem";
ssl_certificate_key "/etc/nginx/fss.rexen.com.cn.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /web1 {
root /opt;
}
location / {
proxy_pass http://localhost:8080;
}
#
location ~/api/v1/saveFile {
proxy_pass http://localhost:8484;
}
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
2.6. 常用配置
server 节点:控制上传文件大小参数client_max_body_size 1024m;
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 500m; # 限制文件上传大小
sendfile on;
keepalive_timeout 65;
upstream https_proxy {
server 192.168.1.110:8080 weight=1;
server 192.168.1.111:8080 weight=1;
ip_hash;
}
2.7. 作为静态服务器的配置
server {
listen 80;
server_name localhost;
location / {
# 这里配置静态文件的路径
root /opt/data;
}
}
默认配置/etc/nginx/conf.d/default.conf 有些时候这个默认配置会启动 80、8080、443端口,这里我们根据需要自己调整。
2.8. 负载均衡与会话保持
负载均衡时,如果APP需要保持特定状态的时候,就要保证同一用户的 session 会被分配到同一台服务器上。
2.8.1. 使用cookie
将用户的 session 存入 cookie 里,当用户分配到不同的服务器时,先判断服务器是否存在该用户的 session,如果没有就先把 cookie 里面的 sessoin 存入该服务器,实现 session 会话保持。缺点是存入 cookie 有安全隐患。
2.8.2. 使用缓存
利用 memcache ,Redis 等缓存分布式的特点,可以将所有服务器产生的 session 存入同一台服务器的缓存中,实现 session 共享。这样安全性比较高,而且从内存中读取 session 比从文件中读取速度快。
2.8.3. 使用 ip_hash
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
如果是 nginx 服务器的负载均衡,可以在 upstream 里设置 ip_hash,每个请求按访问 ip 的 hash 结果分配,映射到固定某一台的服务器。缺点是可能导致负载不均衡。
upstream https_proxy {
server 172.26.114.89:8443;
server 172.26.114.93:8443;
ip_hash;
}
注:ip_hash 不能和 weight 在一起使用。
注:使用案例,使用Spring框架,Redis共享 Session,在页面出错的时候会频繁切换节点,有时候会导致两个节点执行相同的响应,这时就需要启动ip_hash来固定访问者。
2.8.4. 案例A
入口一台Nginx服务器,后端两个Tomcat服务器。
业务服务器使用 Grails + Redis + Hibernate + Postgresql。
负载策略:使用默认轮询的方式,记得使用 ip_hash 来固定访问来源,避免单个用户因切换出现 Session 或者 Cookies 问题。
3. 负载策略
upstream https_proxy {
ip_hash;
server 172.26.114.93:8080;
server 172.26.114.89:8080;
keepalive 2000;
}
3.1. 案例B
upstream https_proxy {
# 通过 hash 的方式来保持 session(如果后端应用本身有共享session的手段则不用开启这个配置,例如使用ridis共享session)
# 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器。
# 根据客户端ip哈希分配,不能和weight一起用
# ip_hash;
# weigth 参数表示权值,权值越高被分配到的几率越大。
# server 172.26.114.89:8080 weight=1 max_fails=3 fail_timeout=30s # 判断后端宕机的超时时间
server 172.26.114.89:8080 weight=1;
server 172.26.114.93:8080 weight=1;
keepalive 2000;
}
3.2. keepalive 参数
默认情况下Nginx访问后端都是用的短连接(HTTP1.0),一个请求来了,Nginx新开一个端口和后端建立连接,请求结束连接回收。如果像上面的配置一样设置了长连接,Nginx会接受客户端的请求,处理完成之后Nginx会【继续保持和后端的长连接】,如果并发请求超过了 keepalive指定的最大连接数,Nginx会启动新的连接来转发请求,新连接在请求完毕后关闭,而且新建立的连接是长连接,这可能会造成额外的问题,最后再说。
keepalive指定的数值是Nginx每个worker连接后端的最大长连接数,而不是整个Nginx 的。而且这里的后端指的是「所有的后端」,而不是每一个后端(已验证)。
在官网上可以看到还有一个 single 参数,说实话我没懂什么意思,但是它已经被废弃了,看这里
HttpUpstreamModule 模块里面还有一共指令:least_conn,解释如下:
Specifies that a group should use a load balancing method where a request is passed to the server with the least number of active connections, taking into account weights of servers. If there are several such servers, they are tried in turn using a weighted round-robin balancing method.
翻译:
指定服务器组的负载均衡方法,根据其权重值,将请求发送到「活跃连接数最少」的那台服务器。 如果这样的服务器有多台,那就采取有权重的轮转法进行尝试。
使用这个指令的时候后端服务器的连接数好像会变的非常少,很奇怪,我还没亲自测过,待确认。
3.3. 配置案例
worker_processes 2;
events {
worker_connections 1024;
}
http {
# 设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
# 允许浏览器请求的最大单文件字节数,例如上传文件限制,注意,部分参数放在这里就是全局生效,如果放在 server 部分,就对单个server生效。
client_max_body_size 500m;
# 日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志和错误日志
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
sendfile on;
keepalive_timeout 65;
# 负载均衡集群群组
upstream https_proxy {
# 后端需要负载的应用地址
# weigth 参数表示权值,权值越高被分配到的几率越大。
# server 172.26.114.89:8080 max_fails=3 fail_timeout=30s # 判断后端宕机的超时时间
# 需要负载的第一个后端应用
server 172.26.114.89:8080;
# 需要负载的第二个后端应用
server 172.26.114.93:8080;
# 通过 hash 的方式来保持 session(如果后端应用本身有共享session的手段则不用开启这个配置,例如使用ridis共享session)
ip_hash;
# 与后端的应用使用 http 1.1 协议进行通信,需要与下面的 proxy_http_version、proxy_set_header 一起使用。
keepalive 2000;
}
# 第一个虚拟服务器
server {
# 监听 fssdemo.rexen.com.cn 的443端口
listen 443;
server_name fssdemo.rexen.com.cn;
ssl on;
ssl_certificate 2752060_fssdemo.rexen.com.cn.pem;
ssl_certificate_key 2752060_fssdemo.rexen.com.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
# 需要负载的机群群组
proxy_pass http://https_proxy;
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $http_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 https;
proxy_http_version 1.1; # 后端配置支持HTTP1.1,必须配置。
proxy_set_header Connection ""; # 后端配置支持HTTP1.1,必须配置。
proxy_redirect off;
[[允许客户端请求的最大单文件字节数]]
client_max_body_size 10m;
[[缓冲区代理缓冲用户端请求的最大字节数,]]
client_body_buffer_size 128k;
[[nginx跟后端服务器连接超时时间]](代理连接超时)
proxy_connect_timeout 90;
proxy_send_timeout 240;
[[连接成功后,后端服务器响应时间]](代理接收超时)
proxy_read_timeout 90;
[[设置代理服务器(nginx)保存用户头信息的缓冲区大小]]
proxy_buffer_size 4k;
[[proxy_buffers缓冲区,网页平均在32k以下的话,这样设置]]
proxy_buffers 4 32k;
[[高负荷下缓冲大小(proxy_buffers]]*2)
proxy_busy_buffers_size 64k;
[[设定缓存文件夹大小,大于这个值,将从upstream服务器传]]
proxy_temp_file_write_size 64k;
}
}
}
3.4. 配置日志
http {
# 日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志和错误日志
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
upstream https_proxy {
}
server {
}
}