# c编译器
yum -y install gcc gcc-c++ autoconf automake make
# 解析正则的pcre库
yum install -y pcre pcre-devel
# 添加对gzip的支持
yum install -y zlib zlib-devel
# SSL
yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
http://nginx.org/en/download.html
解压 nginx 安装包:
[root@xxxx soft]# tar -zxvf nginx-1.9.9.tar.gz
物理机安装并激活 SSL 和 TCP stream模块:
[root@xxxx nginx-1.9.9]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
编译,make命令会向系统路径拷贝文件,需要在root用户下执行:
[root@xxxx nginx-1.9.9]# make
安装:
[root@xxxx nginx-1.9.9]# make install
编译完成后,默认安装在了 /usr/local/nginx 目录。
[root@xxxx nginx-1.9.9]# cd /usr/local/nginx/
[root@xxxx nginx]# ls
conf html logs sbin
可执行文件在sbin目录里面,配置文件在conf目录里面。
为了便于操作,不用每次执行nginx命令都要到/usr/local/nginx/sbin目录下,可以配置下nginx环境变量:
nginx安装目录:/usr/local/nginx
通过 vi /etc/profile 命令修改环境变量,在文件尾部添加以下内容:
export JAVA_HOME=/mnt/soft/jdk1.8.0_351
export JRE_HOME=$JAVA_HOME/jre
export NGINX_PATH=/usr/local/nginx
export PATH=$PATH:$JAVA_HOME/bin:$NGINX_PATH/sbin
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
通过 source /etc/profile 让环境变量生效
在任意目录下执行 nginx -V 验证是否配置成功:
以下命令均需在root用户下执行nginx -s reload
重新加载配置文件启动nginx -s stop
停止nginx服务
worker_processes 4;
worker_rlimit_nofile 655350;
events {
worker_connections 100000;
}
stream {
upstream plcserver{
#least_conn; # 把请求分派给连接数最少的服务器
server 172.18.0.1:2526;
server 172.18.0.2:2526;
#hash $remote_addr consistent;
#server 127.0.0.1:6000 weight=1 max_fails=3 fail_timeout=30s;
#server 127.0.0.1:6002 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 2526;
proxy_pass plcserver;
tcp_nodelay on;
proxy_connect_timeout 1s;
#proxy_timeout 3s;
# 开启代理协议,通过协议发送真实IP
proxy_protocol on;
}
}
http {
include mime.types;
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"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
# 开启gzip压缩
gzip on;
# 不压缩临界值,大于1K的才压缩,一般不用改
gzip_min_length 1k;
# 压缩缓冲区
gzip_buffers 16 64K;
# 压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_http_version 1.1;
# 压缩级别,1-10,数字越大压缩的越好,时间也越长
gzip_comp_level 5;
# 进行压缩的文件类型
gzip_types text/plain
application/x-javascript
text/css
application/xml
application/javascript;
# 跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding"
gzip_vary on;
# IE6对Gzip不怎么友好,不给它Gzip了
gzip_disable "MSIE [1-6]\.";
upstream elecserver {
server 172.18.0.2:8802;
}
server {
listen 80;
#填写证书绑定的域名
server_name 172.18.0.2;
#将所有HTTP请求通过rewrite指令重定向到HTTPS
rewrite ^(.*)$ https://$host$1;
location / {
root /mnt/project/frontend/dist;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
}
server {
listen 443 ssl;
# server_name 172.18.0.2;
ssl_certificate cert/9344252_uniquecharge.cn.pem;
ssl_certificate_key cert/9344252_uniquecharge.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 / {
root /mnt/project/frontend/dist;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /profile {
alias /mnt/uploadPath/;
}
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://elecserver;
}
location /vue/ {
alias /mnt/project/frontend/vue;
}
location /vue/lbx/ {
alias /mnt/project/frontend/h5/;
}
location /web-api/ {
proxy_pass http://elecserver;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# MP_verify_vxs6TlQn9pENraPp.txt
location = /MP_verify_vxs6TlQn9pENraPp.txt {
alias /mnt/uploadPath/MP_verify_vxs6TlQn9pENraPp.txt;
}
}
#nginx优化----------------------
#隐藏版本号
server_tokens on;
#优化服务器域名的散列表大小
server_names_hash_bucket_size 64;
server_names_hash_max_size 2048;
#开启高效文件传输模式
#sendfile on;
#减少网络报文段数量
#tcp_nopush on;
#提高I/O性能
tcp_nodelay on;
#连接超时 时间定义 默认秒 默认65秒
#keepalive_timeout 60;
#读取客户端请求头数据的超时时间 默认秒 默认60秒
client_header_timeout 15;
#读取客户端请求主体的超时时间 默认秒 默认60秒
client_body_timeout 15;
#响应客户端的超时时间 默认秒 默认60秒
send_timeout 25;
#上传文件的大小限制 默认1m
client_max_body_size 8m;
}
参数解释如下:
配置完成后,nginx -s reload平滑重启。
Nginx 的 TCP/UDP 负载均衡是应用 Stream 代理模块(ngx_stream_proxy_module)和 Stream 上游模块(ngx_stream_upstream_module)实现的。Nginx 的 TCP 负载均衡与 LVS 都是四层负载均衡的应用,所不同的是,LVS 是被置于 Linux 内核中的,而 Nginx 是运行于用户层的,基于 Nginx 的 TCP 负载可以实现更灵活的用户访问管理和控制。
Nginx 的 Stream 上游模块支持与 Nginx HTTP 上游模块一致的轮询(Round Robin)、哈希(Hash)及最少连接数(least_conn)负载均衡策略。Nginx 默认使用轮询负载均衡策略,配置样例如下:
stream {
upstream backend {
server 192.168.2.145:389 weight=5;
server 192.168.2.159:389 weight=1;
server 192.168.2.109:389 weight=1;
}
server {
listen 389;
proxy_pass backend;
}
}
哈希负载均衡策略可以通过客户端 IP($remote_addr)实现简单的会话保持,其可将同一 IP 客户端始终转发给同一台后端服务器。
stream {
upstream backend {
hash $remote_addr;
server 192.168.2.145:389 weight=5;
server 192.168.2.159:389 weight=1;
server 192.168.2.109:389 weight=1;
}
server {
listen 389;
proxy_pass backend;
}
}
哈希负载均衡策略通过指令参数 consistent 设定是否开启一致性哈希负载均衡策略。Nginx 的一致性哈希负载均衡策略是采用 Ketama 一致性哈希算法,当后端服务器组中的服务器数量变化时,只会影响少部分客户端的请求。配置样例如下:
stream {
upstream backend {
hash $remote_addr consistent;
server 192.168.2.145:389 weight=5;
server 192.168.2.159:389 weight=1;
server 192.168.2.109:389 weight=1;
}
server {
listen 389;
proxy_pass backend;
}
}
最少连接负载均衡策略,可以在后端被代理服务器性能不均时,在考虑上游服务器组中各服务器权重的前提下,将客户端连接分配给活跃连接最少的被代理服务器,从而有效提高处理性能高的被代理服务器的使用率。配置样例如下:
stream {
upstream backend {
least_conn;
server 192.168.2.145:389 weight=5;
server 192.168.2.159:389 weight=1;
server 192.168.2.109:389 weight=1;
}
server {
listen 389;
proxy_pass backend;
}
}
Nginx 的 TCP/UDP 负载均衡在连接分配时也支持被动健康检测模式,如果与后端服务器建立连接失败,并在 fail_timeout 参数的时间内连续超过 max_fails 参数设置的次数,Nginx 就会将该服务器置为不可用状态,并且在 fail_timeout 参数的时间内不再给该服务器分配连接。当 fail_timeout 参数的时间结束时将尝试分配连接检测该服务器是否恢复,如果可以建立连接,则判定为恢复。配置样例如下:
stream {
upstream backend {
# 10s内出现3次错误,该服务器将被熔断10s
server 192.168.2.154:8080 max_fails=3 fail_timeout=10s;
server 192.168.2.109:8080 max_fails=3 fail_timeout=10s;
server 192.168.2.108:8080 max_fails=3 fail_timeout=10s;
server 192.168.2.107:8080 max_fails=3 fail_timeout=10s;
}
server {
proxy_connect_timeout 5s; # 与被代理服务器建立连接的超时时间为5s
proxy_timeout 10s; # 获取被代理服务器的响应最大超时时间为10s
# 当被代理的服务器返回错误或超时时,将未返回响应的客户端连接请求传递给upstream中的下
# 一个服务器
proxy_next_upstream on;
proxy_next_upstream_tries 3; # 转发尝试请求最多3次
proxy_next_upstream_timeout 10s; # 总尝试超时时间为10s
proxy_socket_keepalive on; # 开启SO_KEEPALIVE选项进行心跳检测
proxy_pass backend;
}
}
其中的参数及指令说明如下。
TCP 连接在接收到关闭连接通知前将一直保持连接,当 Nginx 与被代理服务器的两个连续成功的读或写操作的最大间隔时间超过 proxy_timeout 指令配置的时间时,连接将会被关闭。在 TCP 长连接的场景中,应适当调整 proxy_timeout 的设置,同时关注系统内核 SO_KEEPALIVE 选项的配置,可以防止过早地断开连接。