编辑
2025-07-03
默认分类
00

目录

优化后的配置(HTTP 跳转 HTTPS + 反向代理到 8085)
1. HTTP 强制跳转 HTTPS(301 永久重定向)
2. HTTPS 反向代理到 8085
关键点说明
如何获取 SSL 证书?
测试并重载 Nginx
如何处理?
推荐做法
如果已经误覆盖了怎么办?
结论
1. 检查并杀死占用 80/443 端口的进程
(1) 查看占用端口的进程
(2) 强制终止占用进程
2. 解决 conflicting server name 警告
解决方法
(1) 检查所有 Nginx 配置文件
(2) 保留一个配置,删除或注释其他重复配置
3. 修正 Nginx 配置
(1) 确保证书路径正确
(2) 测试配置并重启
4. 如果问题仍然存在
(1) 检查 Nginx 是否以其他方式运行
(2) 彻底清理 Nginx 进程
5. 验证 HTTPS 访问
总结

以下是一个修改后的Nginx配置,用于将 teek.ysundy.com 反向代理到主机的8085端口:

nginx
server { listen 80; listen [::]:80; server_name teek.ysundy.com; access_log /home/wwwlogs/teek.ysundy.com.log; location / { proxy_pass http://127.0.0.1:8085; 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; # 如果需要处理WebSocket连接,添加以下行 # proxy_http_version 1.1; # proxy_set_header Upgrade $http_upgrade; # proxy_set_header Connection "upgrade"; } # 静态文件缓存设置(可选) location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { proxy_pass http://127.0.0.1:8085; proxy_cache_valid 200 302 12h; proxy_cache_valid 404 1m; expires 12h; } # 保留原有的well-known目录访问权限(用于SSL证书验证等) location ~ /.well-known { allow all; } }

这个配置做了以下修改:

  1. 移除了原有的root目录和PHP相关配置
  2. 添加了反向代理配置,将所有请求转发到8085端口
  3. 保留了基本的日志记录和静态文件缓存设置
  4. 保留了SSL证书验证所需的.well-known目录访问权限

如果你的静态网站不需要PHP支持,这个配置应该可以正常工作。如果需要PHP支持,你可能需要在8085端口的服务中处理,或者根据需要调整配置。

注意:配置修改后需要重新加载Nginx配置:

bash
sudo nginx -t # 测试配置是否正确 sudo systemctl reload nginx # 重新加载配置

你可以在同一个 server 块中添加 301 跳转强制 HTTPS,但最佳实践是使用 两个单独的 server,一个专门处理 HTTP 到 HTTPS 的重定向,另一个处理 HTTPS 的反向代理。

优化后的配置(HTTP 跳转 HTTPS + 反向代理到 8085)

1. HTTP 强制跳转 HTTPS(301 永久重定向)

nginx
server { listen 80; listen [::]:80; server_name teek.ysundy.com; # 301 永久重定向到 HTTPS return 301 https://$host$request_uri; access_log /home/wwwlogs/teek.ysundy.com_http.log; }

2. HTTPS 反向代理到 8085

nginx
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name teek.ysundy.com; # SSL 证书配置(必须) ssl_certificate /path/to/your/fullchain.pem; # 替换为你的证书路径 ssl_certificate_key /path/to/your/privkey.pem; # 替换为你的私钥路径 # SSL 优化配置(可选但推荐) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; access_log /home/wwwlogs/teek.ysundy.com_https.log; # 反向代理配置 location / { proxy_pass http://127.0.0.1:8085; 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; # 如果需要 WebSocket 支持 # proxy_http_version 1.1; # proxy_set_header Upgrade $http_upgrade; # proxy_set_header Connection "upgrade"; } # 静态文件缓存(可选) location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { proxy_pass http://127.0.0.1:8085; proxy_cache_valid 200 302 12h; proxy_cache_valid 404 1m; expires 12h; } # 保留 ACME(Let's Encrypt 证书验证) location ~ /.well-known { allow all; } }

关键点说明

  1. HTTP → HTTPS 301 跳转

    • 第一个 server 块监听 80 端口,直接返回 301 永久重定向到 HTTPS。
    • 这样用户访问 http://teek.ysundy.com 会自动跳转到 https://teek.ysundy.com
  2. HTTPS 反向代理

    • 第二个 server 块监听 443 端口,配置 SSL 证书,并代理到 8085 端口。
    • 必须配置 ssl_certificatessl_certificate_key,否则 HTTPS 无法工作。
  3. SSL 优化(可选但推荐)

    • 使用 TLSv1.2TLSv1.3,禁用不安全的旧版本(如 TLSv1.0、TLSv1.1)。
    • 优化加密套件,提高安全性。
  4. WebSocket 支持(可选)

    • 如果你的 8085 端口服务使用 WebSocket(如 Node.js、WebRTC),取消注释相关配置。

如何获取 SSL 证书?

如果你还没有 SSL 证书,可以使用 Let's Encrypt 免费申请:

bash
sudo apt install certbot python3-certbot-nginx # Debian/Ubuntu sudo certbot --nginx -d teek.ysundy.com # 自动申请并配置

Certbot 会自动修改 Nginx 配置,并设置自动续签。

测试并重载 Nginx

bash
sudo nginx -t # 检查配置是否正确 sudo systemctl reload nginx # 重新加载配置

现在访问 http://teek.ysundy.com 会自动跳转到 https://teek.ysundy.com,并通过反向代理访问 8085 端口的服务。


从你提供的 diff 输出来看,系统检测到 /etc/init.d/nginx 文件存在冲突,可能是因为你之前安装了 LNMP 2.0,而现在系统(或某个更新)尝试安装一个新的版本。

如何处理?

你有几个选项:

  1. YI → 安装软件包维护者的版本(可能会覆盖 LNMP 的配置)
  2. NO → 保留 LNMP 2.0 的版本(推荐,因为 LNMP 可能有特殊优化)
  3. D → 查看具体差异(你已经看到)
  4. Z → 暂停当前操作,进入 shell 检查

推荐做法

由于你使用的是 LNMP 2.0,它可能对 Nginx 进行了定制化修改(比如 PHP-FPM 集成、特殊优化等),所以建议:

  • 选择 N(保留当前版本),避免 LNMP 的功能被覆盖。

如果已经误覆盖了怎么办?

如果已经不小心选择了 Y(覆盖),可以尝试:

  1. 从 LNMP 2.0 重新安装 Nginx
    bash
    cd /root/lnmp2.0 # 进入 LNMP 目录 ./install.sh nginx
  2. 手动恢复 /etc/init.d/nginx(如果有备份):
    bash
    cp /etc/init.d/nginx /etc/init.d/nginx.bak # 先备份当前版本 wget -O /etc/init.d/nginx "https://raw.githubusercontent.com/your-lnmp-repo/lnmp2.0/master/init.d/nginx" # 从 LNMP 官方恢复 chmod +x /etc/init.d/nginx

后续建议

  • LNMP 2.0 的管理命令(推荐使用 LNMP 自带的控制脚本):
    bash
    lnmp nginx {start|stop|reload|restart|status}
    而不是直接使用:
    bash
    service nginx restart # 或 systemctl restart nginx
  • 如果未来需要升级 Nginx,建议通过 LNMP 2.0 的升级脚本,而不是 apt/yum,避免兼容性问题。

结论

选择 N(保留当前 LNMP 2.0 的版本),确保 LNMP 的管理功能不受影响。

根据你的错误信息,Nginx 启动失败的主要原因是 端口冲突(80 和 443 端口已被占用),同时还存在 重复的 server_name 配置。以下是完整的解决方案:


1. 检查并杀死占用 80/443 端口的进程

(1) 查看占用端口的进程

bash
sudo netstat -tulnp | grep -E ':80|:443'

bash
sudo lsof -i :80 sudo lsof -i :443

(2) 强制终止占用进程

bash
sudo pkill -9 nginx # 杀死所有 Nginx 进程 sudo fuser -k 80/tcp # 强制释放 80 端口 sudo fuser -k 443/tcp # 强制释放 443 端口

2. 解决 conflicting server name 警告

错误信息:

nginx: [warn] conflicting server name "teek.ysundy.com" on 0.0.0.0:80, ignored

说明 Nginx 配置中存在重复的 server_name,可能因为:

  • Certbot 修改了 /etc/nginx/sites-enabled/default,但 LNMP 有自己的配置文件(如 /usr/local/nginx/conf/vhost/teek.ysundy.com.conf)。
  • 同一域名在多个配置文件中被定义。

解决方法

(1) 检查所有 Nginx 配置文件

bash
grep -r "teek.ysundy.com" /etc/nginx/ /usr/local/nginx/conf/

(2) 保留一个配置,删除或注释其他重复配置

  • 如果是 LNMP,保留 /usr/local/nginx/conf/vhost/teek.ysundy.com.conf,删除或注释其他文件中的配置。
  • 如果是 Certbot 自动生成的配置,可以合并到 LNMP 的配置中。

3. 修正 Nginx 配置

(1) 确保证书路径正确

编辑 LNMP 的虚拟主机配置(通常位于 /usr/local/nginx/conf/vhost/teek.ysundy.com.conf):

nginx
server { listen 80; server_name teek.ysundy.com; return 301 https://$host$request_uri; # HTTP 跳转 HTTPS } server { listen 443 ssl http2; server_name teek.ysundy.com; # Certbot 提供的证书路径 ssl_certificate /etc/letsencrypt/live/teek.ysundy.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/teek.ysundy.com/privkey.pem; # 其他配置(如反向代理到 8085 端口) location / { proxy_pass http://127.0.0.1:8085; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

(2) 测试配置并重启

bash
sudo nginx -t # 测试配置 lnmp nginx restart # LNMP 专用重启命令

4. 如果问题仍然存在

(1) 检查 Nginx 是否以其他方式运行

bash
ps aux | grep nginx

如果发现多个 Nginx 进程,可能是系统服务和 LNMP 冲突:

bash
sudo systemctl stop nginx # 停止系统 Nginx 服务 sudo systemctl disable nginx # 禁用系统 Nginx 服务 lnmp nginx restart # 使用 LNMP 管理

(2) 彻底清理 Nginx 进程

bash
sudo pkill -9 nginx sudo rm -f /usr/local/nginx/logs/nginx.pid # 删除 PID 文件 lnmp nginx start

5. 验证 HTTPS 访问

bash
curl -I https://teek.ysundy.com

应返回 200 OK


总结

  1. 杀死占用 80/443 端口的进程sudo pkill -9 nginx + sudo fuser -k 80/tcp
  2. 解决 conflicting server name:删除重复配置,保留 LNMP 的虚拟主机文件。
  3. 修正证书路径:确保指向 /etc/letsencrypt/live/teek.ysundy.com/
  4. 优先使用 lnmp nginx restart,避免与系统 Nginx 服务冲突。

如果仍有问题,请提供:

  • grep -r "teek.ysundy.com" /etc/nginx/ /usr/local/nginx/conf/ 的输出
  • ps aux | grep nginx 的结果。

本文作者:任浪漫

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!