Node.js 使用NGINX将端口80转发到8080

Node.js 使用NGINX将端口80转发到8080,node.js,nginx,proxy,debian,Node.js,Nginx,Proxy,Debian,我正在debian服务器上使用LEMP堆栈和节点JS。Nginx在端口80上工作,节点JS在8080上工作。我为nodejs应用程序创建了新的子域:cdn.domain.com。目前我只能像cdn.domain.com:8080/一样访问NodeJS应用程序。我想做的是配置Nginx,这样,当我进入cdn.domain.com时,我可以让应用程序在端口80上工作。我认为可以使用nginx上游实现。但我不知道怎么做 NGINX通过允许在客户端和后端服务器之间设置隧道来支持WebSockets。为了

我正在debian服务器上使用LEMP堆栈和节点JS。Nginx在端口80上工作,节点JS在8080上工作。我为nodejs应用程序创建了新的子域:cdn.domain.com。目前我只能像cdn.domain.com:8080/一样访问NodeJS应用程序。我想做的是配置Nginx,这样,当我进入cdn.domain.com时,我可以让应用程序在端口80上工作。我认为可以使用nginx上游实现。但我不知道怎么做

NGINX通过允许在客户端和后端服务器之间设置隧道来支持WebSockets。为了让NGINX将升级请求从客户端发送到后端服务器,必须显式设置升级和连接头。例如:

# WebSocket proxying
map $http_upgrade $connection_upgrade {
    default         upgrade;
    ''              close;
}


server {
    listen 80;

    # The host name to respond to
    server_name cdn.domain.com;

    location / {
        # Backend nodejs server
        proxy_pass          http://127.0.0.1:8080;
        proxy_http_version  1.1;
        proxy_set_header    Upgrade     $http_upgrade;
        proxy_set_header    Connection  $connection_upgrade;
    }
}

资料来源:

这就是你如何做到这一点的方法

upstream {
    nodeapp 127.0.0.1:8080;
}

server {
    listen 80;

    # The host name to respond to
    server_name cdn.domain.com;

    location /(.*) {
        proxy_pass http://nodeapp/$1$is_args$args;
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Real-Port $server_port;
        proxy_set_header X-Real-Scheme $scheme;
    }
}
您还可以使用此配置在多个节点进程之间实现负载平衡,如下所示:

upstream {
    nodeapp 127.0.0.1:8081;
    nodeapp 127.0.0.1:8082;
    nodeapp 127.0.0.1:8083;
}

在不同的进程中,在端口8081、8082和8083上运行节点服务器。Nginx可以轻松地在这些服务器进程之间实现流量负载平衡。

您可以定义一个上游并在代理过程中使用它

简单的是:

server {
    listen   80;
    server_name  p3000;
    location / {
        proxy_pass http://0.0.0.0:3000;
        include /etc/nginx/proxy_params;
    }
}

就这么简单,

确保将example.com更改为您的域(或IP),将8080更改为您的Node.js应用程序端口:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
        proxy_pass         "http://127.0.0.1:8080";
    }
}

来源:

sudo vi/etc/nginx/sites available/default

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _ your_domain;

    location /health {
            access_log off;
            return 200 "healthy\n";
    }

    location / {
            proxy_pass http://localhost:8080; 
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_cache_bypass $http_upgrade;
    }
  }
这对我很有用:

server {
  listen  80; 
  server_name example.com www.example.com;

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

如果它对您不起作用,请查看sudotail-f/var/log/nginx/error.log上的日志

问题不在于websocket,而在于HTTP。看起来上游在最新的nginx(如1.4.6)中不起作用。我认为语法不同:上游名称{server…}请详细说明您的答案。用户应该能够理解您的建议,而无需遵循将来可能不起作用的场外链接。请投票支持包含显然要使用的
/etc/nginx/proxy_params
。您可以使用
cdn.domain.com
而不是
p3000
来更清楚地回答这个问题。但这在我的情况下效果很好,我想知道为什么所有其他答案都建议使用上游(现在必须检查一下…)。嗨,有了这个解决方案,我是否需要将端口8080打开到外部,或者端口80打开就足够了。感谢您无需打开端口8080或任何其他端口。只开80度就够了,成功了
server {
  listen  80; 
  server_name example.com www.example.com;

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