nginx - 在 VPS 上以生产模式在 Ubuntu 16.04 LTS 上的 NginX/Passenger 服务器上部署 Flask 应用程序
问题描述
问题1:问题是什么?:按照本教程,我安装Nginx
并Passenger
在 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 站点包?
解决方案
解决方案是在应用程序的配置文件中(在服务器上下文中)添加 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 版本。
推荐阅读
- c# - 在 ASP.NET Core 中全局重用变量
- angular - 奇怪的变化检测行为Angular 2+
- html - 在 wordpress 主题的移动导航栏中添加站点名称
- javascript - 如何连接样式
- octobercms - 如何实现 Rainlab 的 User Plus+ 插件的定位功能?
- regex - 将 perl 单行转换为脚本
- php - 关于替换 URL 中 1 个字符的更优雅解决方案的建议
- amazon-cloudformation - Sub 和 Join 逗号分隔列表
- npm - Gulp SASS 不编译 @import 更改
- c# - 如何重定向到 ASP.NET Core Razor 页面中的页面或路径