Nginx 负载均衡及其 HTTPS 部署
Nginx 是最流行的软负载均衡中间件。本文以 CentOS 为例,使用 Nginx 实现 Tomcat 多实例负载均衡的部署,并总结了安装 HTTPS 证书的方法。
作者:王克锋
出处:https://kefeng.wang/2016/12/29/nginx-https/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。
1 概述
Nginx(发音为“Engine X”),使用基于BSD许可,作者是俄罗斯人。
是个轻量级、高性能的 HTTP 服务器和反向代理服务器,也是IMAP/POP3/SMTP 代理服务器。
国内各大门户网站已经部署了 Nginx,如阿里、腾讯、新浪、网易等。
2 安装与配置
2.1 安装
优点是自动化安装,缺点是不可指定 Nginx 版本(比如下面的操作只能安装版本 1.14.0)。
如果对 Nginx 版本没有特别要求,推荐使用该方式,本文也是采用此方式。
如果是 Windows 环境,下载 nginx-1.15.2.zip 并解压后即可直接运行 nginx.exe。
1 | ## sudo vim /etc/yum.repos.d/nginx.repo |
2.2 配置为 systemd 服务
注意:nginx.service 与 nginx.conf 中的 pid 配置必须一致(建议用 /var/run/nginx.pid)。1
2
3
4
5
6sudo systemctl enable nginx
sudo systemctl start nginx
curl http://localhost/
# sudo systemctl stop nginx
# sudo systemctl disable nginx
2.3 防火墙放行
1 | ### sudo vim /etc/sysconfig/iptables |
2.4 常用文件
1 | ls -l /usr/sbin/nginx ## 主文件 |
2.5 常用命令
1 | sudo nginx -v ## 查看版本(nginx/1.10.2) |
3 基本配置
http://nginx.org/en/docs/
http://nginx.org/en/docs/ngx_core_module.html
3.1 工作进程
主进程只能 1 个,用来读取配置文件、管理工作进程;
工作进程个数由 worker_processes 指定,用来处理请求。
3.2 配置符号
容量符号: k/m(K/M)
时间符号: yMdhms/ms/w(周)
事件模型: use [select|poll|epoll]
3.3 配置文件结构
Nginx 由指令控制的模块组成,指令包括简单指令和块指令。
简单指令形如“name value;”,块指令形如“name [value] {}”,不在块中的指令被认为是在主块 main{} 中。
3.4 主配置
下面的配置是充当前面三个 Tomcat 实例(端口号分别为 8001/8002/8003)的负载均衡。
相关链接: Tomcat 安装及其单机多实例部署。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47## sudo vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto; # 工作进程个数(auto或具体数值比如2)
error_log /var/log/nginx/error.log warn; # 错误日志文件、日志级别
pid /var/run/nginx.pid;
events {
worker_connections 1024; # 最大并发连接数
use epoll; # 网络I/O模型
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on; # 启用内核复制模式, 有利于I/O
keepalive_timeout 60; # 长连接持续时长
# 配置 gzip 压缩,可用于:http, server, location
gzip on; # 开启gzip(默认为关闭)
gzip_min_length 1k; # 设置允许压缩的页面最小字节数(默认为0), 小于1k可能会越压越大。
gzip_buffers 4 8k; # 原始数据大小以 8k 为单位的4倍申请内存
gzip_comp_level 5; # gzip压缩比(默认为1), 取值为1-9, 压缩比与CPU消耗成正比
gzip_types text/plain text/css text/javascript application/x-javascript; # 这些 MIME 才压缩(无论是否指定, text/html总是压缩)
# 预定义 upstream 及其名字,将在 http.server.location.proxy_pass 中引用: http://upstream_name
# http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
# http://nginx.org/en/docs/http/load_balancing.html
upstream upstream_tomcat {
# 常见负载均衡机制:
# (1)round-robin; # 轮询分配(缺省值)
# (2)ip_hash; # 访问者IP地址的哈希值,可保证同一客户端落在同一服务器上
# (3)least_conn; # 最少连接
# (4)fair; # 响应时间短的优先分配
server localhost:8001 weight=3; # 指定权重(三种机制都适用)
server localhost:8002; # 默认权重为1
server localhost:8003; # 默认权重为1
}
include /etc/nginx/conf.d/*.conf; ## 各个 server{} 块
}
3.5 HTTP/HTTPS 配置
1 | ## sudo vim /etc/nginx/conf.d/default.conf |
3.6 验证
1 | curl http://centos |
4 准备证书
4.1 生成 X509 V3 扩展文件
1 | ## sudo mkdir -p /etc/nginx/ssl/ |
4.2 生成密钥和证书文件
http://chenjumin.iteye.com/blog/2328875
1 | ## cd /etc/nginx/ssl/ |
4.3 检查并重新加载 Nginx
1 | sudo nginx -t |
5 客户端验证
5.1 设置 hosts
Linux: /etc/hosts1
2
3127.0.0.1 centos
127.0.0.1 kefeng.wang
127.0.0.1 www.kefeng.wang
WINDOWS: C:\Windows\System32\drivers\etc\hosts1
2
3192.168.214.132 centos
192.168.214.132 kefeng.wang
192.168.214.132 www.kefeng.wang
5.2 Linux 下导入根证书
1 | # sudo cp /etc/pki/tls/certs/ca-bundle.crt{,.bak} ## 首次备份 |
执行 curl https://kefeng.wang
时报错:1
2curl: (60) Issuer certificate is invalid.
More details here: http://curl.haxx.se/docs/sslcerts.html
浏览网址 https://curl.haxx.se/docs/sslcerts.html 发现原因和解决办法:
curl 对无法识别自签名证书,需要采取两种措施之一:
curl 忽略服务器证书验证
1
curl -k https://kefeng.wang
curl 指定获取到的 CA 证书
1
2openssl x509 -in <(openssl s_client -connect localhost:443 -prexit 2>/dev/null) | sudo tee curl.pem
sudo curl --cacert curl.pem https://kefeng.wang
5.3 Windows 下导入根证书
对于 Nginx 中使用个人证书,如果不在 Windows 下导入根证书,Chrome 浏览器会报错:
地址栏会有感叹号和红斜线,“您的连接不是私密连接”,展开“高级”才能继续访问。
个人证书安装方法:从 Linux 下载 nginx.crt,Windows 下双击安装,指定证书存储位置“受信任的根证书颁发机构”。
使用 Chrome 浏览器打开 https://kefeng.wang, HTTPS 相关标志全部正常。