nginx:设置 SSL 反向代理(负载平衡 SSL 代理)
反向代理是安装在服务器网络中的代理服务器。通常,反向代理用于 Apache、IIS 和 Lighttpd 等 Web 服务器的前端。如何将 nginx Web 服务器设置为 SSL 反向代理?
当您有多个后端 Web 服务器时,可以通过反向代理进行加密/SSL 加速。Nginx 可以充当 SSL 加速软件。它提供了以下好处:
我们的示例设置
Internet-- | ============= |---- apache1 (192.168.1.15) | ISP Router| | ============= |---- apache2 (192.168.1.16) | | | |---- db1 (192.168.1.17) | |eth0 -> 192.168.1.11 ----------/ |-lb0==| / | |eth1 -> 202.54.1.1:443---/ | | |eth0 -> 192.168.1.10 ----------\ |-lb1==| / |---- apache1 (192.168.1.15) |eth1 -> 202.54.1.1:443---/ | |---- apache2 (192.168.1.16) | |---- db1 (192.168.1.17)
- lb0 – 通过 eth1 直接连接到互联网的 Linux 机器。这是主 SSL 负载均衡器。
- lb1 – Linux 机器通过 eth1 直接连接到互联网。这是备用 SSL 负载均衡器。如果主网络出现故障,它将变为活动状态。
- 202.54.1.1 在lb0和lb1之间移动的虚拟IP地址。由keepalived管理。
- nginx – 安装在 lb0 和 lb1 上。
- SSL 证书 – 您需要在 lb0 和 lb1 上安装 ssl 证书。
为了演示目的,我将使用自签名 SSL 证书,但您也可以使用由 CA 签名的真实 SSL 证书。
+------+ +-------------+ +-------------------+ |Client| <---> |SSL-Nginx:443| <----> |Apache-HTTP_mode:80| +------+ +-------------+ +-------------------+
- 您已经建立了客户端和 Nginx 之间的 SSL 连接。
- 然后 Nginx 充当代理服务器并在端口 80 处与 Apache 建立未加密的连接。
- Nginx可以缓存所有静态文件和其他文件。
生成自签名证书
首先,创建所需的目录:
要创建私钥,请输入:
示例输出:
# cd /usr/local/nginx/conf
# mkdir ssl
# cd ssl
# openssl genrsa -des3 -out example.in.key 1024
# openssl req -new -key example.in.key -out example.in.csr
示例输出:
请输入您想要与证书关联的域名。例如,对于命令名称,我输入了 example.in,因为我将使用 https://example.in/。
如何删除密码?(可选)
您可以删除密码,这样 nginx 就可以在启动时启动而无需输入密码。输入以下命令
最后,您应该看到以下三个文件(请注意,我已以 vivek 用户身份创建所有文件,然后移动了 lb0 和 lb1 服务器 /usr/local/ngnix/conf/ssl/ 目录):
示例输出:
# cp example.in.key example.in.key.bak
# openssl rsa -in example.in.key.bak -out example.in.key
# ls -l
# openssl x509 -req -days 365 -in example.in.csr -signkey example.in.key -out example.in.crt
示例输出:
如何将 SSL 证书文件复制到 lb1?
您需要将这些文件复制到 lb1,输入:
# ssh root@lb1 mkdir /usr/local/ngnix/conf/ssl
# rsync -av /usr/local/ngnix/conf/ssl/* root@lb1:/usr/local/ngnix/conf/ssl/
将 Nginx 配置为 SSL 反向代理(lb0 和 lb1)
编辑nginx.conf,输入(需要在lb0和lb1上编辑文件):
# vi /usr/local/ngnix/conf/nginx.conf
编辑/附加如下:
server { ### server port and name ### listen 202.54.1.1:443; ssl on; server_name example.in; ### SSL log files ### access_log logs/ssl-access.log; error_log logs/ssl-error.log; ### SSL cert files ### ssl_certificate ssl/example.in.crt; ssl_certificate_key ssl/example.in.key; ### Add SSL specific settings here ### ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers RC4:HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; keepalive_timeout 60; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ### We want full access to SSL via backend ### location / { proxy_pass http://example; ### force timeouts if one of backend is died ## proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; ### Set headers #### proxy_set_header Accept-Encoding ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ### Most PHP, Python, Rails, Java App can use this header ### #proxy_set_header X-Forwarded-Proto https;## #This is better## proxy_set_header X-Forwarded-Proto $scheme; add_header Front-End-Https on; ### By default we don't want to redirect it #### proxy_redirect off; }
保存并关闭文件。重新加载 nginx:
验证端口是否打开:
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# netstat -tulpn | grep :443
如何从 Shell 提示符测试和调试 SSL 证书?
使用openssl 命令如下:
$ openssl s_client -connect example.in:443
或者最好使用以下命令:
$ openssl s_client -connect example.in:443 -CApath /usr/share/ssl-cert/ -servername example.in
- 有关更多详细信息,请参阅“如何从Shell 提示符验证 SSL 证书”。
如何缓存常用文件?
编辑nginx.conf,添加如下内容,缓存常用文件:
location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ { proxy_buffering on; proxy_cache_valid 200 120m; expires 864000; }
保存并关闭文件。重新加载 nginx:
# nginx -s reload
- CentOS / Redhat Linux:安装 Keepalived 为 Web 集群提供 IP 故障转移
- CentOS / Redhat:安装 nginx 作为反向代理负载均衡器
- 使用 KeepAlived 处理 nginx 故障转移
- nginx:设置 SSL 反向代理(负载平衡 SSL 代理)
- mod_extforward:Lighttpsd 记录客户端在反向代理/负载均衡器后面的真实 IP
- 如何合并 Apache / Lighttpsd / Nginx 服务器日志文件
- Linux nginx:Chroot(Jail)设置
- 操作方法:SPDY SSL 安装和配置
- 在 CentOS/RHEL 上使用 Yum 命令安装 Nginx
- 在 Nginx 上创建自签名 SSL 证书