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

问题描述 投票:0回答:1

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

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

我已使用git push ...将项目上传到我的Ubuntu 16.04服务器。如here所述,我已经在其中运行npm run 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查找要在生产模式下运行的文件?还是我应该以一种完全不同的方式考虑这个问题?

reactjs nginx passenger
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.