首页 > 解决方案 > 在 VPS 上以生产模式在 Ubuntu 16.04 LTS 上的 NginX/Passenger 服务器上部署 Flask 应用程序

问题描述

问题1:问题是什么?:按照本教程,我安装NginxPassenger在 Ubuntu 16.04 上运行 Python Flask应用程序,我遇到了这个问题:当我在浏览器中访问我的服务器http://hXXXXXXX.stratoserver.net/时,我收到了这个错误:

我们很抱歉,但有些不对劲。

问题2:Passenger版本及集成方式:Passenger开源6.0.4 + Nginx

问题 3:操作系统或 Linux 发行版、平台(包括版本):Ubuntu 16.04 LTS

$ uname -a
Linux hXXXXXXX.stratoserver.net 4.4.0-042stab141.3 #1 SMP Fri Nov 15 22:45:34 MSK 2019 x86_64 x86_64 x86_64 GNU/Linux

问题4:passenger安装方式:Nginx + Phusion APT repo

问题 5:您的应用程序的编程语言:Python 3.7.6 + Flask 1.1.1

问题 6:您是否使用 PaaS 和/或容器化?如果有,是哪一个?

问题 7:关于您的设置还有什么我们应该知道的吗? 我在strato.nl 有一个安装了 Ubuntu 16.04 的 VPS,主机地址是:http ://hXXXXXXX.stratoserver.net/我正在按照“使用Passenger 部署 Python 应用程序到生产环境”教程在教程:

1. Linux/Unix
2. Nginx
3. Passenger open source
4. Python installed via LinuxBrew (Python v3.7.6)
5. Ubuntu 16.04 LTS
6. Demo Flask app from github

演示 Flask 应用程序是从 Phusio Passenger github 克隆的,如下所示:

git clone https://github.com/phusion/passenger-python-flask-demo.git

运行 passenger-memory-stats给出:

$ sudo /usr/sbin/passenger-memory-stats
Version: 6.0.4
Date   : 2020-01-29 13:12:15 +0100
------------- Apache processes -------------
*** WARNING: The Apache executable cannot be found.
Please set the APXS2 environment variable to your 'apxs2' executable's filename, or set the HTTPD environment variable to your 'httpd' or 'apache2' executable's filename.


---------- Nginx processes -----------
PID    PPID   VMSize    Private  Name
--------------------------------------
23320  1      174.9 MB  0.8 MB   nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
23325  23320  174.9 MB  0.8 MB   nginx: worker process
### Processes: 2
### Total private dirty RSS: 1.54 MB


----- Passenger processes -----
PID    VMSize    Private  Name
-------------------------------
23309  445.7 MB  2.5 MB   Passenger watchdog
23312  672.3 MB  7.5 MB   Passenger core
### Processes: 2
### Total private dirty RSS: 9.98 MB

当我在服务器上本地运行应用程序时,一切都按预期工作:

$ python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

然后在另一个终端:

$ curl localhost:5000
<!DOCTYPE html>
<html>
<head>
  <title>Hello</title>
  <style>
    html, body {
      font-family: sans-serif;
      background: #f0f0f0;
      margin: 4em;
    }

    .main {
      background: white;
      border: solid 1px #c0c0c0;
      border-radius: 8px;
      padding: 2em;
    }
  </style>
</head>
<body>

  <section class="main">
    <h1>Hello world!</h1>
    <p>Welcome to the Passenger Flask example app.</p>
  </section>

</body>
</html>

所以看起来本地一切正常。但是,当我在浏览器中访问http://hXXXXXXX.stratoserver.net/时,我得到了一个如上所述的错误页面。nginx 错误/var/log/nginx/error.log包含以下内容:


App 29730 output: from flask import Flask, render_template
App 29730 output: ImportError
App 29730 output: :
App 29730 output: No module named flask

所以看起来脚本找不到我之前为 Python3 安装的包,它使用 Python2 包。sys.version在服务器响应中打印给出:

sys.version: 2.7.17 (default, Dec 24 2019, 17:49:09)

我为 Python3 安装了所有软件包,因此我需要服务器上的脚本使用 Python3。如何在 NginX/Passenger 中设置 Python 版本和 Python 库?

我的演示应用配置是:

$ vi /etc/nginx/sites-enabled/demoapp.conf
server {
    listen 80;
    server_name hXXXXXXX.stratoserver.net;

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

    # Turn on Passenger
    passenger_enabled on;
}

我需要设置哪些乘客/Nginx 设置才能成功运行 Flask 应用程序?如何设置Passenger / Nginx 以使用Python3 和Python3 站点包?

标签: nginxflaskubuntu-16.04passengervps

解决方案


解决方案是在应用程序的配置文件中(在服务器上下文中)添加 Python 二进制文件的路径。所以现在我的配置文件 demoapp.conf 看起来像:

$ vi /etc/nginx/sites-enabled/demoapp.conf
server {
    listen 80;
    server_name hXXXXXXX.stratoserver.net;

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /var/www/demoapp/code/public;
    
    # Tell Nginx and Passenger which Python executable to use
    passenger_python /Users/<username>/.pyenv/versions/3.9.2/envs/v3.9.2/bin/python3;

    # Turn on Passenger
    passenger_enabled on;
}

一切都按预期工作。请注意这一行:

passenger_python /home/linuxbrew/.linuxbrew/bin/python3;

它指向我使用 linuxbrew 安装的 Python v3.7.6 二进制文件。

另一种选择是使用 Python 虚拟环境,您还可以在其中指定要使用的 Python 版本。


推荐阅读