使用Phusion Passenger部署使用create-react-app构建的应用

时间:2020-01-05 19:07:25

标签: reactjs nginx passenger

我已经创建了一个从命令npx create-react-app myapp开始的Web应用程序。我希望将Phusion Passenger与Nginx结合使用,以从其自己的子域中为该应用程序提供服务。我的问题(我相信)是告诉Phusion Passenger在哪里可以找到Node.js需要启动的文件。

在我的开发机器上一切正常。

我已使用git push ...将项目上传到我的Ubuntu 16.04服务器。如here所述,我已经运行npm run build

根据文档,此...

  • 将要生产的应用构建到build文件夹。
  • 在生产模式下正确捆绑React,并优化构建以获得最佳性能。
  • 确保最小化构建,文件名包含哈希。

简而言之:您的应用已准备好进行部署。

我已成功使用serve -s build在端口5000上启动应用程序,并已使用curl http://localhost:5000检查了服务器上本地是否存在缩小的HTML文件。

现在,我需要告诉Phusion Passenger启动该应用程序,这是我需要帮助的地方。按照here的说明,我创建了以下nginx配置文件:

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

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /var/www/myapp/web/public;

    # Turn on Passenger
    passenger_enabled on;
    # Tell Passenger that your app is a Node.js app
    passenger_app_type node;
    passenger_startup_file app.js; ## THIS IS WHERE I THINK THE ISSUE IS ##
} 

我的理解是,最后一行必须指示Node.js应该启动哪个文件。对于使用npx create-react-app...创建的项目,Node.js在开发模式下启动的文件位于src/index.js,而不是app.js

我应该在哪里告诉passenger_startup_file查找要在生产模式下运行的文件? 还是我应该以一种完全不同的方式来思考这个问题?

1 个答案:

答案 0 :(得分:0)

您的方法还可以,并且Nginx / Phusion Passeger默认在production模式下运行。

我还没有尝试运行Node应用程序,但是我是针对Python做到的。我认为对于Node它的工作方式相同。但是,我不需要指定passenger_app_typepassenger_startup_file,因为Phusion Passenger使用默认的Python应用设置,例如:

passenger_app_type wsgi;
passenger_startup_file passenger_wsgi.py;

passenger_wsgi.py或您的情况下的app.js是应用程序的入口点,因此必须在应用程序的文件夹中创建:/var/www/myapp/web在此文件中,您需要导入您实际的Node应用。因此,保持配置文件不变,但请确保在app.js中导入并启动Node应用程序。 wsgi应用程序名称必须为“ application”,因此在我的情况(Python应用程序)中,passenger_wsgi.py仅包含一行:

from app import MyApp as application

您的app.js可能已经是您的Node应用程序,因此您不需要在此导入应用程序,这取决于您进行设置的方式...

您可以在nginx默认位置/var/log/nginx/error.log上看到错误日志,但是要查看内容,您可能需要使用:

sudo vi /var/log/nginx/error.log

打开文件并清除它,或者在最后一行标记“ START NEW LOG”,以便在下次打开日志进行查看时知道新日志的起始位置。 重新启动服务器:

$ sudo service nginx restart

然后转到浏览器并打开页面:http://www.yourdomain.com,然后回到服务器并查看Nginx错误日志。

您在日志中看到了什么? 有时,让您的Node脚本或入口点文件(app.js)打印一些信息(如环境变量等)会有所帮助,以确保它使用正确的信息,并且一切都按您的期望进行设置。因此,对于Python,我可以在我的app.py中或直接在passenger_wsgi.py中进行:

import sys
import os 
def application(environ, start_response):
       start_response("200 OK", [("Content-Type", "text/plain")])
       ret = ["%s: %s\n" % (key, value)
               for key, value in environ.items()]
       ret.append('sys.version: {}\n'.format(sys.version))
       ret.append('sys.executable: {}\n'.format(sys.executable))
       ret.append('sys.path: {}\n'.format(sys.path))
       return ret

但是您需要将其转换为JavaScript或TypeScript,因为您的应用程序是Node应用程序。因此,下次您在浏览器中打开应用程序时,将看到打印的环境和系统设置。然后,需要将其与在终端中的服务器上本地运行应用程序时看到的内容进行比较(不使用浏览器和URL) 希望对您有帮助