使用nginx在端口80上提供静态站点和节点应用程序?

时间:2014-09-17 21:57:08

标签: node.js nginx reverse-proxy

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

CORS的另一个问题是,我的快递应用配置为允许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 关注此事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。我们会看到。

1 个答案:

答案 0 :(得分: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;
}