项目部署
大多数WSGI服务器也提供HTTP服务器,因此WSGI服务器可以独立运行WSGI应用程序并提供外部服务。当然,在专用HTTP服务器(如Apache或Nginx)后面运行WSGI服务器仍然是一个好主意。
代码语言:javascript复制$ gunicorn -w 4 -b 0.0.0.0:5000 your_project:app
在大多数情况下,默认的同步工作程序就足够了。如果您需要异步支持,uWSGI会使用gevent提供一个worker。这与Python的异步/等待和ASGI服务器规范不同。 使用gevent时,需要greenlet>=1.0。否则,上下文局部变量(如请求)将无法工作。使用PyPy时,需要PyPy>=7.3.7。
代码语言:javascript复制$ uwsgi --master --gevent 100 --http 0.0.0.0:5000 -w your_project:app
代码语言:javascript复制import eventlet
from eventlet import wsgi
from your_project import app
wsgi.server(eventlet.listen(("", 5000), app)
如果要在HTTP代理后面的上述服务器上运行应用程序,则必须重写一些标头。在WSGI环境中,有两个变量经常导致问题:REMOTE_ADDR和HTTP_HOST可以通过设置httpd来传递这些头,或者在中间件中修复这些问题。 Werkzeug附带了一个修复工具,可用于常见设置,但可能需要为特定设置编写自己的WSGI中间件。
代码语言:javascript复制server {
listen 80;
server_name _;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
如果httpd无法提供这些标头,最常见的设置是调用X-Forwarded-host定义的主机和X-Forwarded For定义的远程地址:
代码语言:javascript复制from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
代码语言:javascript复制class CustomProxyFix(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
host = environ.get('HTTP_X_FHOST', '')
if host:
environ['HTTP_HOST'] = host
return self.app(environ, start_response)
app.wsgi_app = CustomProxyFix(app.wsgi_app)
Uwsgi是基于Python模块中的WSGI调用的。假设Flask应用程序名称为myapp-Py,可以使用以下命令:
uwsgi 启动
–管理脚本名称将_ name处理移至uwsgi,因为uwsgi将更智能。结合–mount,您可以将发送到/yourreplication的请求重定向到myapp:app。如果可以在根级别访问应用程序,则可以使用单个/代替/yourreplication。Myapp是指烧瓶应用程序的文件名(无扩展名)或所提供应用程序的模块名。应用程序可以在应用程序内部调用(通常app=Flask(name))。 如果要在虚拟环境中部署应用程序,则需要添加–virtualnv/path/to/virtual/environment。您可能还需要根据项目使用的python版本添加–plugin-python或–plugin-python3。
代码语言:javascript复制location = /yourapplication { rewrite ^ /yourapplication/; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/tmp/yourapplication.sock;
}
这个配置把应用绑定到 /yourapplication
代码语言:javascript复制location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/tmp/yourapplication.sock;
}
Apache
example.com/yourapplication。fcgi/news/有几种方法可以避免这种情况。更好的方法是使用ScriptAlias和SetHandler配置指令将请求路由到FastCGI服务器。以下示例使用FastCgiServer启动五个应用程序实例来处理所有传入请求:
代码语言:javascript复制LoadModule fastcgi_module /usr/lib64/httpd/modules/mod_fastcgi.so
FastCgiServer /var/www/html/yourapplication/app.fcgi -idle-timeout 300 -processes 5
<VirtualHost *>
ServerName webapp1.mydomain.com
DocumentRoot /var/www/html/yourapplication
AddHandler fastcgi-script fcgi
ScriptAlias / /var/www/html/yourapplication/app.fcgi/
<Location />
SetHandler fastcgi-script
</Location>
</VirtualHost>
该处理将由Apache管理。如果使用单独的FastCGI服务器,则可以使用FastCgiExternalServer指令。请注意,以下路径不是真实的。当匹配别名时,它仅用作标识符,以将其与其他指令区分开来:
代码语言:javascript复制FastCgiServer /var/www/html/yourapplication -host 127.0.0.1:3000
如果无法设置ScriptAlias,例如,如果使用共享网络主机,则可以使用WSGI中间件设置复制。
代码语言:javascript复制<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
<Files ~ (.fcgi)>
SetHandler fcgid-script
Options FollowSymLinks ExecCGI
</Files>
</IfModule>
<IfModule mod_rewrite.c>
Options FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ yourapplication.fcgi/$1 [QSA,L]
</IfModule>
如下:
代码语言:javascript复制#!/usr/bin/python
#: optional path to your local python site-packages folder
import sys
sys.path.insert(0, '<your_local_path>/lib/python<your_python_version>/site-packages')
from flup.server.fcgi import WSGIServer
from yourapplication import app
class ScriptNameStripper(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['SCRIPT_NAME'] = ''
return self.app(environ, start_response)
app = ScriptNameStripper(app)
if __name__ == '__main__':
WSGIServer(app).run()
记住要启用FastCGI、别名和重写模块。上述配置将应用程序绑定到/yourreplication。如果您希望应用程序在根URL下运行,则必须使用LighttpdCGIRootFix中间件来解决lighttpd缺陷。 请确保仅当应用程序在根URL下运行时才使用上述中间件。 Nginx和其他服务器不会加载FastCGI应用程序。 必须自己加载它们。主管可以管理FastCGI进程。 在启动期间,可以使用其他FastCGI进程管理器或编写脚本来运行。fcgi文件,例如使用SysV init.d脚本。 对于临时使用,可以运行。fcgi脚本。
su www-data cd /var/www/yourapplication