【问题标题】:Serve static site and node app on port 80 with nginx?使用 nginx 在端口 80 上提供静态站点和节点应用程序?
【发布时间】:2014-09-17 21:57:07
【问题描述】:

所以现在我在 mysite:4300 上为我的后端应用程序提供服务,在 mysite:80 上提供我的静态站点。这没关系,但会导致一些问题,一个是 SSL 我必须获得两个签名证书,至少我认为。

另一个问题是 CORS,这不是一个大问题,我的 express 应用程序配置为允许 CORS,但我想在一个来源下提供所有服务。

这是我的 nginx 配置的外观。

我在 /etc/nginx/conf.d/mysite.com.conf 中创建

server {
    listen 80;

    server_name mysite.com;

    location / {
        proxy_pass http://localhost:3100;  //node js port
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

所以基本上上面允许我在端口:80 上为端口:3100 提供我的 nodejs 应用程序(使用 forever.js 运行)。

这显然会劫持我的静态网站,但我想知道如何将其配置为在 mysite.com/myApp 上提供服务

我的问题

如何将 nginx 配置为不是 mysite.com:80 而是 mysite.com:80/myApp 的代理,以便我可以在 mysite.com:80 上提供我的静态网站?

我是否需要重新考虑我是如何使用代理的,或者是否有我可以使用的配置方法?

P.S 关注这个 tut https://www.digitalocean.com/community/tutorials/how-to-host-multiple-node-js-applications-on-a-single-vps-with-nginx-forever-and-crontab

也许我需要配置 DNS 记录,或者创建一个子域?

解决方案:我最终使用了一个子域,但我认为它几乎是相同的概念。

感谢@Peter Lyons,我有这个服务器块

server {
    listen 80;

    server_name app.mysite.com;

    location / {
        root /var/www/mySite/public_html;
        proxy_pass http://localhost:3100;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    location @app {
       proxy_pass http://localhost:3100;
    }
}

在我添加根和位置@app 之前它无法工作,所以现在它在端口:80 上工作正常,因此不再有在 url 中暴露的端口号。希望我现在可以为此设置 SSL!

我想我会尝试像 mysite.com/myApp 一样提供它来测试它,将来可能会派上用场。

P.S 我也可以避免使用子域,因为它仍然被认为是跨域Are AJAX calls to a sub-domain considered Cross Site Scripting?

我可能希望允许我的应用与我的网站进行通信,避免使用 CORS 可能会更容易。也就是说,如果 mysite.com/myAPP 也不被视为 CORS。我们会看到。

【问题讨论】:

    标签: node.js nginx reverse-proxy


    【解决方案1】:

    试试:proxy_pass http://localhost:3100/myApp$uri;,我认为应该可以满足您的需求。

    当我想让 nginx 提供静态文件时,我使用 try_files 像这样:

    location / {
      root /path/to/my/app/wwwroot;
      try_files $uri $uri.html $uri/index.html @app;
    }
    
    location @app {
      proxy_pass http://localhost:3100;
    }
    

    【讨论】:

    • 谢谢,我要试试这个。我只是设置了一个子域,但我认为即使使用 HTTPS 提供子域,我也需要一个新证书。使用上面的配置,一个证书是否适用于应用程序和静态站点?不管怎样,谢谢,试用后我会回帖。
    • 是的,您只需要每个主机名一个证书(除非您有一个您可能没有的通配符证书)和每个证书一个 IP 地址,但是您可以从那里使用 nginx 来提供静态文件以及无论您想在不同的 URL 路径上部署多少应用程序。
    • 谢谢,我是否只创建一个类似于我为默认服务器创建的 https 块?我将使用子域,但看起来您的答案有助于正确配置服务器,因此我将使用此答案,并在我的问题中发布我的虚拟主机块。
    • 因为在您的快速代码中您没有为/myApp 定义路线。如果您希望 express 应用程序不知道前缀,则您的 nginx 配置将更改为重写 URL 以在将请求上游代理为 express 之前省略前缀。
    • 是的,它需要在该 URL 呈现您想要的任何内容,在这种情况下,它可能是您应用的主页。
    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 2019-12-29
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多