502 x2容器内PM2管理的NodeJS服务器的502错误网关

问题描述 投票:0回答:1

我有一个运行Ubuntu 18.04的数字海洋小滴,里面是一个lxc容器。我在该容器中有两个应用程序。

第一个应用程序(客户端)位于/var/www/html,第二个应用程序是NodeJS应用程序,位于/var/www/my-site/。容器内的Node应用程序由pm2管理,到目前为止,一切似乎都工作正常,因为当我在容器终端上输入curl http://localhost:3000时,我会返回所需的输出。

/etc/nginx/sites-available下的主Droplet(不是容器)内,有以下两个服务器块-defaultmy-site

当我尝试通过我的域通过浏览器访问它时,第一个应用程序运行良好,但是当我尝试通过502 Bad Gateway访问它时,NodeJS应用程序返回一个sub.mydomain.com。容器内的pm2 start告诉我节点应用程序状态为online

这是我的default服务器阻止文件。这可行。当我访问mydomain.com时,我的网站显示正常。

# HTTP — redirect all traffic to HTTPS
server {
    listen 80;
    listen [::]:80 default_server ipv6only=on;
    return 301 https://$host$request_uri;
}

server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name mydomain.com;
    # Use the Let’s Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    location / {
        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_pass http://container_ip_address /;
    }
}

现在是另一个服务器块-my-site

# Upstream config
upstream site_upstream {
    server 127.0.0.1:3000;
    keepalive 64;
}

server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name sub.mydomain.com www.sub.mydomain.com;
    root /var/www/my-site;

    # Use the Let’s Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://site_upstream;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }
}

[我已经在域的DNS设置中为子域的A记录设置了我的Droplet的IP地址,并且我还为/etc/nginx/sites-enabled服务器块创建了指向my-site的符号链接。

我已在互联网上搜寻该问题的解决方案,但似乎没有任何效果。我想念什么?

非常感谢您的帮助。谢谢。

node.js nginx digital-ocean lxc
1个回答
0
投票

这里的问题是,对子域的请求没有被定向到lxc容器。我通过在my-site服务器块内添加以下内容来解决此问题。

location / {
        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_pass http://container_ip/;
    }

此后,我在下一个位置块中添加了一个星号。

location /* {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://site_upstream;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }

解决该问题的另一种方法是在默认服务器块的server_name指令中包括子域。这行得通,但唯一的问题是nginx会抱怨它在运行my-site时不得不忽略我在nginx -t服务器块中设置的服务器,否则,它就可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.