【问题标题】:Nginx multiple ports under one serverNginx 一台服务器下的多个端口
【发布时间】:2018-07-09 19:27:40
【问题描述】:

我有:

  • Nginx 在公网 IP 上运行:123.456.78.910

  • Node.js 应用 1 运行于:localhost:8081

  • Node.js 应用 2 运行于:localhost:8082

两个 Node.js 应用程序都使用 websockets。

我想要这样:

  • 123.456.78.910 显示一些通用的index.html 文件

  • 123.456.78.910/projecta 转到localhost:8081

  • 123.456.78.910/projectb 转到localhost:8082

我不确定我是否只需要location <PATH> {} 或服务器块/虚拟主机、https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04 或别名的想法。

server {
        listen 80;

        root /var/www/html;

        location /projecta {
                rewrite ^/projecta(.*) /$1 break;
                proxy_pass http://127.0.0.1:8081;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        location /projectb {
                rewrite ^/projectb(.*) /$1 break;
                proxy_pass http://127.0.0.1:8082;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

【问题讨论】:

    标签: nginx


    【解决方案1】:

    location 块只能存在于server 或其他location 中,因此您无需删除server

    假设您想提供一些静态上下文,您需要再添加一个location 块:

    location / {
        root   /var/www/html; # better to move from 'server' as it's not used in any other 'location'
        index  index.html;
    }
    

    至于rewrite ^/projecta(.*) /$1 break; - 它只是从URI 中删除/projecta 子字符串。 IE。如果你向123.456.78.910/projecta发送请求,nginx会将此请求代理到http://127.0.0.1:8081

    这是添加该行的目的吗?如果是这样,我建议您不要使用rewrite,而是将尾部斜杠添加到proxy_pass 中指定的地址:

    proxy_pass http://127.0.0.1:8081/;
    

    否则,使用此rewrite 指令,您将看到可能不需要的行为:如果您向123.456.78.910/projecta/whatever 发送请求,nginx 会将此请求代理到http://127.0.0.1:8081/whatever

    【讨论】:

    • 抱歉,我编辑了我的问题以便更清楚。我认为我需要location /projectalocation /projectb?我可能不需要location /,只需要root /var/www/html;在/ 提供通用index.html file?我的 Node.js 应用程序实际上有 websockets,所以我想我需要你在 #3 中提到的东西?
    • @adamt32 请检查更新后的答案。是的,代理 websocket 流量需要 proxy_http_versionproxy_set_headers。
    • 除了一个小问题外几乎可以完美运行。如果出现以下情况会出现什么问题:我可以使用暴露的端口访问123.456.78.910:8082,但proxy_pass http://127.0.0.1:8082/; 没有完全加载?正如我可以看到该站点,但请求没有解决。非常接近。
    • @adamt32,不确定我是否理解了这个问题。根据你的 nginx 配置,123.456.78.910 不应该在端口 8082 上可用。你能逐步描述有问题的场景吗?
    • 我针对这个更具体的问题提出了一个新问题:stackoverflow.com/questions/48556250/…
    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2015-03-08
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多