【Flask】大型项目要进行项目部署的技术实操(Apache)

2022-12-13 18:26:54 浏览数 (1)

项目部署

大多数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

0 人点赞