ruby-on-rails - Nginx 有 1 个域名,2 个应用程序。罗尔+nodejs

标签 ruby-on-rails node.js express nginx server


嘿。
经过几个小时的研究,我找不到任何简单的方法来解决我的问题。

我之前编写了一个 RoR 应用程序,该应用程序部署在我的服务器上并且运行良好。现在我正在尝试部署一个 Nodejs 应用程序来与我的 RoR 应用程序一起运行。这两个应用程序彼此没有任何关系 - 它们要单独使用。

我只有一个域可供使用,并且我正在尝试使用 Nginx。 RoR 应用程序已经在 Unicorn + Nginx 上运行。

我的第一个问题是在同一服务器上部署两个单独的应用程序的正确方法是什么?
他们应该监听不同的端口吗?例如,其他端口:80 和其他端口:81?
或者我应该使用子文件夹?想要 exampleDomain/app1 和 exampleDomain/app2 吗?
我还阅读了有关创建子域的选项,但是在生产中运行我的应用程序时这是否有效?

我的 RoR 应用程序是按照以下说明部署的: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-unicorn-and-nginx-on-ubuntu-14-04 (请注意,我正在使用 Digital Ocean 的虚拟服务器)

目前我的 Nginx 文件如下所示:

upstream app {
    # Path to Unicorn SOCK file, as defined previously
    server unix:/home/deploy/appname/shared/sockets/unicorn.sock fail_timeout=0;
}

server {
    listen 80;
    server_name localhost;

    root /home/deploy/appname/public;

    try_files $uri/index.html $uri @app;

    location @app {
        proxy_pass http://app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

这是上述 RoR 教程的直接副本。由于某种原因,如果我切换文件名,它就会停止工作?即使我找不到在任何地方定义的文件名。 该文件位于/etc/nginx/sites-available/下,名为“default”。

我尝试按照本教程部署 Nodejs 应用程序: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-14-04 我让我的应用程序使用 pm2 运行。我尝试在/etc/nginx/sites-available/中的另一个文件中编写以下代码,并将代码与 RoR 代码一起包含在现有默认文件中,但它们都不起作用。

server {
    listen 80;

    server_name example.com;

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

Nginx 日志也没有显示任何有用的内容。我跑了
sudo tail -f/var/log/nginx/error.log
几次但日志是空的。

如果有人能给我一些指导,我将非常感激。

最佳答案

第一个问题“如何将两个应用程序放在同一服务器上?”。

您提到的所有这些方法都可以,但对您和潜在用户来说最干净的方法可能是使用子域。为此,

1) 确定您的子域(即nodejs.example.com 和ror.example.com)并将它们都指向您的服务器。

2) 在每个名称的 2 个 ngnix 文件中,将服务器名称设置为相应的子域:

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

  # Rest of conf below (pointing to ROR project)
}

还有:

server {
  listen 80;
  server_name nodejs.example.com

  # Rest of conf below (pointing to nodejs project)
}

第二个问题:“我将这些文件放在哪里?”

要查看 nginx 实际使用这些文件的位置,我首先查看主 nginx.conf 文件,通常位于“/etc/nginx/nginx.conf”位置。末尾附近应该有 2 行告诉你 nginx 在哪里寻找conf文件:

http {
  # A bunch of default nginx settings

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

如果这是您的 nginx.conf 文件中的内容,那么 nginx 永远不会在 site-available 文件夹中查找。 nginx 实际查找的位置是在两个文件夹中:/etc/nginx/conf.d/和/etc/nginx/sites-enabled 我建议做三件事:

1) cd 进入/etc/nginx/sites-enabled 文件夹。删除“默认”文件。

2) 创建 2 个文件,nodejs 和 ror,并将相应的 nginx 配置放入文件夹中的这两个文件中:/etc/nginx/sites-enabled。

3)运行:

sudo service nginx reload
sudo service nginx restart

如果重新加载失败,请运行以下命令来帮助调试配置:

sudo nginx -t

这将显示问题的文件和行号。

希望这有帮助。如果您遇到任何问题,请发表评论。

关于ruby-on-rails - Nginx 有 1 个域名,2 个应用程序。罗尔+nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241446/

相关文章:

ruby-on-rails - 在 Ruby on Rails 中创建草稿状态

javascript - Sequelize-auto 无法连接到命名的 MSSQL 实例

mysql - Express JS 使用 Mysql 获取正确的 JSON

ruby-on-rails - 通过发送更新 ActiveRecord

ruby-on-rails - 与 ActiveRecord 中的属性的自引用关联

javascript - 如何编写 Mongoose 查询来过滤子文档

node.js - 如何在 useEffect() Hook 中使用异步方法

javascript - browserify 'Error: Cannot find module' 试图修复 'Uncaught reference error: require is not defined'

javascript - 为 promise 链导出 Express 路由方法的最佳方式?

ruby-on-rails - Heroku、Unicorn 和延迟作业上的 Rails:PG::ConnectionBadappmodels/post.rb:93 PQconsumeInput() SSL SYSCALL 错误:连接超时