大多数WSGI服务器也提供HTTP服务器,因此WSGI服务器可以独立运行WSGI应用程序并提供外部服务。当然,在专用HTTP服务器(如Apache或Nginx)后面运行WSGI服务器仍然是一个好主意。
$ 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。
$ uwsgi --master --gevent 100 --http 0.0.0.0:5000 -w your_project:app
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中间件。
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定义的远程地址:
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
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,可以使用以下命令:
–管理脚本名称将_ name处理移至uwsgi,因为uwsgi将更智能。结合–mount,您可以将发送到/yourreplication的请求重定向到myapp:app。如果可以在根级别访问应用程序,则可以使用单个/代替/yourreplication。Myapp是指烧瓶应用程序的文件名(无扩展名)或所提供应用程序的模块名。应用程序可以在应用程序内部调用(通常app=Flask(name))。
如果要在虚拟环境中部署应用程序,则需要添加–virtualnv/path/to/virtual/environment。您可能还需要根据项目使用的python版本添加–plugin-python或–plugin-python3。
location = /yourapplication { rewrite ^ /yourapplication/; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/tmp/yourapplication.sock;
}
这个配置把应用绑定到 /yourapplication
location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/tmp/yourapplication.sock;
}
example.com/yourapplication。fcgi/news/有几种方法可以避免这种情况。更好的方法是使用ScriptAlias和SetHandler配置指令将请求路由到FastCGI服务器。以下示例使用FastCgiServer启动五个应用程序实例来处理所有传入请求:
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指令。请注意,以下路径不是真实的。当匹配别名时,它仅用作标识符,以将其与其他指令区分开来:
FastCgiServer /var/www/html/yourapplication -host 127.0.0.1:3000
如果无法设置ScriptAlias,例如,如果使用共享网络主机,则可以使用WSGI中间件设置复制。
<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>
如下:
#!/usr/bin/python
#: optional path to your local python site-packages folder
import sys
sys.path.insert(0, '/lib/python/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
$ python application.fcgi
Traceback (most recent call last):
File “yourapplication.fcgi”, line 4, in
ImportError: No module named yourapplication