如何在Nginx中为3000端口绑定已有的SSL证书
问题根源
你添加listen 3000 ssl配置无效的核心原因是3000端口已经被你运行的Django服务占用了,Nginx无法重复监听同一台服务器上已经被占用的端口,自然配置不会生效。
你不需要修改现有SSL证书,你的证书已经签发为example.org,只要访问的域名是example.org,不管使用哪个端口,证书都可以正常复用。
推荐解决方案(最安全易用)
不用对外暴露3000端口,直接通过Nginx反向代理将Django服务挂载到现有域名的子路径下,所有请求统一走443端口的SSL加密,访问路径可以设为https://example.org/api/ 类似形式,修改你的Nginx配置如下:
server { listen 80 default_server; server_name example.org; return 301 https://example.org$request_uri; } server { listen 443 ssl; server_name example.org; ssl_certificate /etc/nginx/ssl/ssl_bundle.crt; ssl_certificate_key /etc/nginx/ssl/example.key; # React 静态资源配置 location / { root /home/ubuntu/example/build; index index.html index.htm; try_files $uri $uri/ /index.html; # 适配React前端路由 } # Django 反向代理配置 location /api/ { # 末尾带斜杠会自动去掉/api前缀转发到Django,如需保留/api前缀可去掉末尾斜杠 proxy_pass http://127.0.0.1:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 如果Django用到WebSocket可添加以下两行配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
配置修改后执行nginx -t检查配置无误,再执行nginx -s reload重载配置即可生效。后续你所有Django相关的请求都可以直接访问https://example.org/api/xxx,全程走SSL加密,不需要再额外加端口号。
如需保留3000端口访问的解决方案
如果你一定要保留example.org:3000的访问形式,可以按以下步骤操作:
- 先修改Django服务的启动配置,将监听地址从
0.0.0.0:3000改为127.0.0.1:3000,避免公网直接访问未加密的Django端口,同时释放公网3000端口给Nginx使用 - 在Nginx配置中新增一个server块,配置如下:
server { listen 3000 ssl; server_name example.org; ssl_certificate /etc/nginx/ssl/ssl_bundle.crt; ssl_certificate_key /etc/nginx/ssl/example.key; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
- 检查Nginx配置无误后重载配置,之后访问
https://example.org:3000就可以正常加载SSL证书。
注意:如果你的服务器开启了防火墙,需要放开3000端口的入站规则才能正常访问。
内容的提问来源于stack exchange,提问作者ank
相关产品推荐
相关产品推荐

