Nginx 配置与故障排查指南

1. 配置 Nginx 代理到特定端口

1.1 编辑 Nginx 配置文件

在 Nginx 的配置目录中创建或编辑一个配置文件,例如 /etc/nginx/conf.d/example.conf

sudo nano /etc/nginx/conf.d/example.conf

1.2 添加服务器块配置

在配置文件中添加以下内容,将请求代理到 8080 端口:

server {
    listen 80;
    server_name example.com;  # 替换为实际域名

    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}

1.3 验证并重新加载 Nginx 配置

验证配置文件的语法正确性:

sudo nginx -t

重新加载 Nginx 以应用更改:

sudo systemctl reload nginx

2. 配置 SSL/TLS 证书

2.1 安装 Certbot

根据你的系统安装 Certbot:

  • Ubuntu:

    sudo apt update
    sudo apt install certbot python3-certbot-nginx
    
  • CentOS/RHEL:

    sudo yum install epel-release
    sudo yum install certbot python3-certbot-nginx
    

2.2 生成证书

使用 Certbot 自动配置 Nginx:

sudo certbot --nginx -d example.com  # 替换为实际域名

2.3 验证证书

访问 https://example.com 并检查证书是否有效。你也可以使用 SSL Labs SSL Test 进行检测。

2.4 配置 Nginx 以使用 SSL/TLS

在 Nginx 配置文件中配置 SSL/TLS:

server {
    listen 80;
    server_name example.com;  # 替换为实际域名
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;  # 替换为实际域名

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-CBC-SHA256:ECDHE-RSA-AES256-CBC-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384';
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}

2.5 重新加载 Nginx 配置

sudo systemctl reload nginx

3. 解决端口冲突问题

3.1 查找占用端口的进程

使用以下命令查找占用 443 端口的进程:

sudo netstat -tulnp | grep :443

或:

sudo ss -tulnp | grep :443

3.2 停止占用端口的进程

根据找到的进程 ID (PID),停止该进程:

sudo kill -9 <PID>

3.3 检查 Nginx 配置

确保没有多个 Nginx 配置文件试图监听相同的端口:

sudo grep -R "listen 443" /etc/nginx/

3.4 检查 Apache 配置(如果适用)

确认 Apache 配置文件中没有监听 443 端口:

sudo grep -R "Listen 443" /etc/httpd/

或:

sudo grep -R "Listen 443" /etc/apache2/

3.5 调整 Nginx 配置

如果需要,同时运行 Nginx 和其他服务时,可以调整 Nginx 配置文件中的端口号:

server {
    listen 8443 ssl;
    server_name example.com;  # 替换为实际域名

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-CBC-SHA256:ECDHE-RSA-AES256-CBC-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384';
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}

3.6 重新启动相关服务

重启 Nginx 和其他相关服务:

sudo systemctl restart nginx
sudo systemctl restart apache2  # 如果你使用的是 Apache

3.7 检查系统状态

检查系统是否有其他端口冲突情况或资源争用问题:

sudo lsof -i :443

3.8 确认系统时间

确保服务器的系统时间准确:

date

总结

通过以上步骤,你可以配置 Nginx 以使用 SSL/TLS,并解决端口冲突问题。确保你的服务配置正确,证书有效,且端口未被其他进程占用。如果问题仍然存在,请详细检查错误日志并与相关支持团队联系获取进一步帮助。

作者: erishen

前端工程师 React, React Native, Taro Node.js, Next.js, Express, Nest.js PHP, Java / Spring Boot Python, Go, Rust ...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注