文章目录
- 需求
- 准备工作
- 具体步骤
- 查询本地ip是否开放443端口
- 在安全组配置开放443端口
- 在防火墙开放443端口
- 安装SSL证书到Nginx
1. 需求
近来客户请求网站使用https协议,因此撰写了本文。
2. 准备工作
- 云服务器–这里采用的是阿里云的云服务器
- SSL证书–这里演示个人测试证书
- xshell
- PC一台
3. 具体步骤
- 购买个人测试证书
个人测试证书购买链接
- 上传文件到服务器上
将获取的证书文件上传至服务器,存放在一个安全的外部目录(/etc/ssl/cert)。
- 测试本地系统类型
命令:
cat /etc/os-release
这里显示的是:
- 开放服务器443端口
- 查询本地ip是否开放443端口
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat
sudo ss -tlnp | grep -q ':443 ’ || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443
- 在安全组配置开放443端口
进入云服务器ECS实例,点击目标实例名称进入实例详情页面,参考添加安全组规则,在安全组中增加一条授权策略为允许,协议类型为TCP,目的端口范围为HTTPS(443),授权对象为任意位置(0.0.0.0/0)的规则。
- 在防火墙开放443端口
执行以下命令,识别系统当前的防火墙服务类型
if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then
echo "firewalld"
elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then
echo "ufw"
elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then
echo "nftables"
elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then
echo "iptables"
elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then
echo "iptables"
else
echo "none"
fi
若输出为none,则无需进一步操作,否则,请根据输出的类型(firewalld, ufw, nftables, iptables),执行以下命令开放443端口:
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload
4. 安装SSL证书到Nginx
- 安装到本地nginx
上传pem, key文件至/etc/ssl/cert目录下。
为Nginx安装SSL模块,若输出–with-http_ssl_module则说明已经安装SSL模块,无需再次安装
nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'
如果出现 nginx: command not found,请根据Nginx的实际安装路径(如:/usr/local/nginx/sbin/nginx -V...)
请根据Nginx的安装方式(编译安装或包管理工具安装)。选择对应的SSL模块安装方法:
- PS:在升级Nginx过程中,Nginx服务可能会短暂中断,影响线上业务;务必提前备份所有Nginx配置文件和站点数据,并选择业务低峰期操作,完成升级后及时恢复配置并验证服务正常。
安装Nginx方式1—利用包管理工具:
编译安装
b. 查看当前Nginx编译参数
nginx -V
记录configure arguments:后的所有参数,后续重新编译时需要全部保留。
c. 下载与当前 Nginx 版本相符的源码包
运行 nginx -v 查看当前 Nginx 版本
具体可以参考官方手册操作即可
官方手册
4.2 部署到 Nginx
本文路径文件夹
因此,修改 docker-compose.yml 配置文件路径:
version: "3.8"
services:
nginx:
image: nginx:alpine
container_name: nginx-static
ports:
- "80:80" # HTTP 用于跳转 HTTPS
- "443:443" # HTTPS 主要端口
volumes:
- /root/PAPER/nginx/nginx.conf:/etc/nginx/nginx.conf:ro # 挂载配置文件
- /root/PAPER:/usr/share/nginx/html:ro # 挂载网页根目录(/PAPER → 容器内 /usr/share/nginx/html)
- /root/PAPER/datasets:/usr/share/nginx/html/datasets:ro # 挂载数据集目录(/PAPER/datasets → 容器内 /usr/share/nginx/html/datasets)
- /root/PAPER/nginx/var/log/nginx:/var/log/nginx # 挂载日志目录
- /etc/ssl/cert:/etc/nginx/ssl # 挂载证书目录
restart: unless-stopped
接着进入 Nginx 配置文件
cd nginx
vim nginx.conf
修改配置文件为:
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# ===== HTTPS 服务器块 =====
server {
listen 443 ssl;
server_name blogcenter.top;
# 证书配置(容器内路径,与 docker-compose 挂载一致)
ssl_certificate /etc/nginx/ssl/blogcenter.top.pem;
ssl_certificate_key /etc/nginx/ssl/blogcenter.top.key;
# 网页根目录:/index.html 直接在 /PAPER 下
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html; # 解决单页应用刷新 404
}
# 数据集目录:/datasets 直接在 /PAPER 下
location /datasets/ {
root /usr/share/nginx/html;
autoindex off;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# ===== HTTP 自动跳转 HTTPS =====
server {
listen 80;
server_name blogcenter.top;
return 301 https://$host$request_uri;
}
}
最后启动 Nginx 服务器:
docker compose up -d
各位老板,创作不易,点点关注~