Nginx配置SSL(HTTPS)详解
Nginx配置SSL(HTTPS)详解
Nginx作为一款高性能的HTTP和反向代理服务器,自然支持SSL/TLS加密通信。随着互联网安全性的日益重要,HTTPS协议逐渐成为网站加密通信的标配。本文将详细介绍如何在Nginx中配置SSL,实现HTTPS的访问。
使用Nginx进行反向代理时的注意事项
使用Nginx进行反向代理的时候,对于正常的http流量使用location块并且配置proxy_pass转发即可,但是如果是https的流量,使用Nginx进行反向代理的时候,直接使用proxy_pass会出现各种报错的情况,包括不限于:
- 502 Bad Getway
- ERR_SSL_PROTOCOL_ERROR
- ERR_CONNECTION_RESET
我本身遇到的ERR_SSL_PROTOCOL_ERROR错误比较多,这是因为在配置Nginx的时候,对于443端口本身的侦听没有带上ssl关键字,所以会报SSL协议错误,但是如果加上ssl,没有给证书位置,也是不行
对于转发到8080端口,如果配置不对(比如后端服务是http,结果配置了https),会出现502 Bad Getway
- proxy_pass后边的要写IP地址,不能写域名,否则还要解决域名解析的问题,有据称如果写localhost的,访问速度会变慢,是因为需要访问host文件解析localhost
- 响应8080端口的server块,也要注意,也要写成侦听ssl,配置好证书位置
upstream plan-uat {
server 10.202.159.74:8080 max_fails=3 fail_timeout=10 weight=1;
}
server {
server_name plan-uat.ztoky.cn;
listen 443 ssl;
ssl_certificate ssl/ztoky.cn.crt;
ssl_certificate_key ssl/ztoky.cn.key;
access_log logs/plan-uat.ztoky.cn.access.log json;
location /plan/ {
proxy_pass http://plan-uat/;
include proxy.conf;
}
}
检查Nginx是否安装SSL模块
要检查Nginx是否安装了SSL模块,可以执行以下命令:
cd /usr/local/nginx/sbin
./nginx -V
如果输出中包含--with-http_ssl_module
,则说明SSL模块已经安装。
为Nginx安装SSL模块
如果没有安装SSL模块,可以按照以下步骤进行安装:
- 进入Nginx源码目录:
cd /usr/local/nginx-1.18.0
- 配置SSL模块并重新编译:
./configure --with-http_ssl_module
make
- 替换Nginx可执行文件:
cp ./nginx /usr/local/nginx/sbin/
- 重启Nginx并再次检查SSL模块是否安装成功:
cd /usr/local/nginx/sbin/
./nginx -V
准备SSL证书
首先,我们需要准备SSL证书。你可以选择从证书颁发机构(CA)购买商业证书,也可以自己生成自签名证书。自签名证书虽然免费,但不会被浏览器信任,仅适用于测试环境。
如果你选择购买商业证书,通常会获得以下文件:
- 证书文件(例如:example.com.crt)
- 私钥文件(例如:example.com.key)
- 中间证书文件(如果有的话)
配置Nginx SSL并启用443端口
打开Nginx配置文件,通常位于
/etc/nginx/nginx.conf
或/etc/nginx/conf.d/default.conf
。在
http
块中,配置SSL相关参数。示例如下:
http {
...
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/example.com.crt; # 证书文件路径
ssl_certificate_key /path/to/example.com.key; # 私钥文件路径
# 如果有中间证书,也需要配置
ssl_trusted_certificate /path/to/intermediate.crt;
# 其他SSL配置参数
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3; # 支持的协议版本
ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL; # 使用此加密套件
ssl_prefer_server_ciphers on; # 优先使用服务器端的加密套件
# 其他server配置...
}
...
}
测试HTTPS访问
现在,你的Nginx服务器已经配置了SSL,可以通过HTTPS协议访问了。在浏览器中输入https://example.com
,检查是否能够成功访问并显示安全的连接标识(如绿色锁头)。
此外,你还可以使用命令行工具(如openssl或curl)来测试HTTPS连接和证书的有效性。
配置代理
使用proxy_pass
指令来配置代理。以下是一个示例配置,将HTTPS请求代理到另一个HTTPS服务器:
server {
# 监听443端口,处理所有HTTPS请求
listen 443 ssl;
server_name your.domain.com;
# SSL配置
ssl_certificate /path/to/your/cert.pem;
ssl_certificate_key /path/to/your/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
# 代理配置,将HTTPS请求代理到另一个HTTPS服务器
location / {
proxy_pass https://your.backend.server;
}
}
以上配置假设您的域名是your.domain.com
,代理目标是您的后端HTTPS服务器(例如https://your.backend.server
)。请记住将路径和参数适当地配置为您的特定场景。