Nginx配置主、子域名SSL证书
本文只讨论Ubuntu
安装 Nginx
如果还未安装 Nginx,可以通过以下命令进行安装
# Ubuntu/Debian
sudo apt update
sudo apt install nginx
# CentOS/RHEL
sudo yum install epel-release
sudo yum install nginx
安装 Certbot
Certbot 用来自动申请和更新 SSL 证书,这也是为了 HTTPS。
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
修改创建并修改Nginx配置文件
# 创建 Nginx 配置文件:
cd /etc/nginx/sites-enabled
sudo touch config
# 使用 vim 编辑配置文件:
sudo vim ./config
添加
server{
server_name <domain>;
location / {
client_max_body_size 64m;
proxy_http_version 1.1;
proxy_pass http://localhost:<port>;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_cache_bypass $http_upgrade;
proxy_set_header Accept-Encoding gzip;
}
}
注意要将上面的 <domain>
和 <port>
替换为实际的域名和端口号。
对于使用了 WebSocket 的应用,我们可能还需要设置更长的超时时间:
proxy_read_timeout 300s;
proxy_send_timeout 300s;
编辑好之后保存(:wq!
),继续下面的流程:
# 使用 certbot 获取 SSL 证书:
sudo certbot --nginx
# 按照提示选择即可。
# 之后使用 vim 再次编辑配置文件。
sudo vim ./config
# 我们会发现配置文件此时已经加入了 SSL 相关内容。
# (可选)启用 HTTP2:
# 在配置文件内,把
listen 443 ssl; # managed by Certbot
# 改为:
listen 443 ssl http2; # managed by Certbot
# 之后重启 Nginx:
sudo service nginx restart
至此,大功告成,SSK应该已经生效,添加替换访问的http为https即可。
对于配置子域名SSL的情况,我们也可以使用certbot来生产
在当前文件夹下输入
certbot certonly -d *.使用自己的域名替换.com -d 使用自己的域名替换.com --manual --preferred-challenges dns
certonly: 这个子命令表示只获取证书,而不会自动安装或配置它。
-d *.使用自己的域名替换.com: 这个参数指定了你要获取证书的域名,其中*.使用自己的域名替换.com表示获取一个通配符证书,适用于该域名下的所有子域名。
-d 使用自己的域名替换.com:这个参数是将主域名也加入到证书中,否则会导致子域名正常了,主域名提示证书不合法。
--manual: 这个参数表示手动模式。在手动模式下,你需要按照指示手动完成一些步骤,例如DNS验证。
--preferred-challenges dns: 这个参数指定了首选的验证方式为DNS验证。DNS验证需要你在你的DNS管理后台添加一个TXT记录来验证你对域名的所有权。
certbot certonly -d *.by2tech.com -d by2tech.com --manual --preferred-challenges dns
输入后会要求你在域名解析中加入txt记录类型,并且地址已经打印出来了
之后证书就生成完毕了,并且有效期为三个月
配置SSL证书
配置主、子域名使用SSL证书并监听443端口
#主域名
server {
server_name xx.com;
client_max_body_size 1024m;
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/{你证书所在的位置}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{你证书所在的位置}/privkey.pem;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
location / {
proxy_pass http://127.0.0.1:8090;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection 'upgrade';
proxy_set_header Upgrade $http_upgrade;
proxy_cache_bypass $http_upgrade;
proxy_set_header Accept-Encoding gzip;
}
}
#子域名1
server {
listen [::]:443 ssl ipv6only=on;
listen 443 ssl; #
ssl_certificate /etc/letsencrypt/live/{你证书所在的位置}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{你证书所在的位置}/privkey.pem;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
server_name xx.xxx.com;
client_max_body_size 1024m;
location / {
proxy_pass http://127.0.0.1:3501;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection 'upgrade';
proxy_set_header Upgrade $http_upgrade;
proxy_cache_bypass $http_upgrade;
proxy_set_header Accept-Encoding gzip;
}
}
配置http跳转至https
在当前目录下
vim http
加入配置来强制跳转,并将无效地址返回404
server {
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
listen 80;
#支持ipv6访问
listen [::]:80;
return 404;
}
之后执行nginx -s reload
访问网站即可进入
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 By2Tech
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果