用Flask和Apache发布API

以中文母语,用3行表达 – 只需一个选项:

用3行话阐述如下信息:

    • 自分で作った機械学習モデルを簡単にweb上にAPIとして公開したい。

 

    • flaskを使うとpythonのアプリケーションがwebに公開できる。

 

    apacheを使う場合、.confにmod_wsgiの設定を書く必要がある。設定例を公開する。

目标 (mù

从终端出发

curl https://example.com/yourapp

作った変更は最終的に全体の品質や効果に影響を与える可能性があります。

由此产生的变更可能最终对整体内容的质量和效果产生影响。

Hello World!!!!

表示为

环境

項目使用環境クラウドサービスAWS EC2OSubuntu 18.04 LTSサーバーソフトApache/2.4.29 (Ubuntu)認証局let’s encrypt

必要的工作 de

    1. 安装apache

 

    1. (选项)支持https

 

    1. 安装mod_wsgi

 

    1. 更改apache设置

禁用目录列表
设置文档根目录
加载mod_wsgi设置

安装flask
用flask创建应用程序
修改wsgi文件

整个团队需要注意

当Apache没有按预期行动时,通过查看日志进行故障排除是非常重要的。
对于Ubuntu,默认情况下日志位于/var/log/apache2目录下。例如

tail /var/log/apache2/error.log

请查看日志。
如果Apache无法启动,请查看systemd的日志。可以使用以下命令进行查看。

journalctl | grep apache2

安装Apache并启用https支持。

你可以参考我之前写的文章。
在Ubuntu 18.04+Apache上实现https支持。

安装 mod_wsgi


注意 – Pay attention

当查看Flask公式文档时,我们可以看到以下说明:使用apt-get install libapache2-mod-wsgi命令可以安装mod-wsgi,但此命令将安装Python 2版本的mod-wsgi。如果您想要使用Python 3版本,请避免执行此命令。
参考链接:https://flask.palletsprojects.com/en/1.1.x/deploying/mod_wsgi/


要在Apache中创建Python的Web应用程序,需要使用mod_wsgi。

mod_wsgi 是一个实现了易于使用的 Apache 模块,可以托管任意的 Python Web 应用程序,并支持 Python WSGI 规范。
详见:https://modwsgi.readthedocs.io/en/develop/

我们使用pip来安装mod_wsgi,因为我们python开发者不喜欢从源代码编译安装,因为这会缩短生命周期。你可以在https://pypi.org/project/mod-wsgi/找到mod_wsgi的安装信息。

如果你正在使用Debian或Ubuntu Linux操作系统的Apache 2.4系统包,无论使用哪个Apache MPM模块,你都需要同时安装以下两个:
apache2
apache2-dev
https://pypi.org/project/mod-wsgi/

因此,安装apache2-dev之后使用pip安装mod-wsgi。

sudo apt install apache2-dev
pip3 install mod-wsgi

在确认操作之前,将Apache的设置更改。

更改Apache的配置

禁用目录列表配制

首先,更改设置以防止显示这种类型的文件。
查看/etc/apache2/apache2.conf。

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

我认为应该将Indexes从Options中删除。

<Directory /var/www/>
        Options FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

没问题。
请参考。

如果请求的URL映射到目录,并且目录中没有指定的文件(例如index.html),则mod_autoindex将格式化目录内的列表并返回。

设置文档根目录

在访问自己的域名时,可以设置哪个目录作为根目录(文档根目录)。
默认情况下是/var/www/html/。
而作为”Apache2 Ubuntu 默认页面”显示的内容实际上是/var/www/html/index.html。

您可以在/etc/apache2/apache2.conf(以及使用let’s encrypt的certbot时在/etc/apache2/sites-available/000-default-le-ssl.conf中)中进行此设置。例如,如果您想将/home/ubuntu/apache_docroot设置为文档根目录。

<Directory /home/ubuntu/apache_docroot>
        Options FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

使用certbot时,在VirtualHost指令内(如果是/etc/apache2/sites-available/000-default-le-ssl.conf文件中),添加以下内容。

DocumentRoot /home/ubuntu/apache_docroot

因为默认情况下有DocumentRoot /var/www/html的描述,所以我想你应该知道该写在哪里。

加载mod_wsgi模块的配置

首先,需要告诉 apache 安装的 mod_wsgi 的安装路径,可以使用 pip 来安装。

这是

python -c "import sys; print(sys.path)"

执行操作后,在显示的目录下的某个子目录中找到了.so文件。
在我的环境中,它位于以下位置。

/home/ubuntu/.local/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

写入VirtualHost指令内部即可完成。

LoadModule wsgi_module /home/ubuntu/.local/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

接下来,请创建用于决定mod_wsgi行为的.wsgi文件。
例如,在/home/ubuntu/apache_docroot目录下创建一个名为yourapp的文件夹,然后将下面的内容写入名为hello.wsgi的文件并保存。

def application(environ, start_response):
    status = '200 OK'
    output = b'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

在VirtualHost的配置中,您需要在WSGIScriptAlias段落中添加以下内容,以便读取hello.wsgi文件。
如果想在访问https://example.com/yourapp这个URL时,能够自动读取hello.wsgi文件,请按照以下方式进行配置。

WSGIScriptAlias /yourapp /home/ubuntu/apache_docroot/yourapp/hello.wsgi

第一个参数是相对于所设置的URL的文档根目录的路径,第二个参数是.wsgi文件的绝对路径。

到此为止,重新写下来,最终的VirtualHost指令如下。

<VirtualHost *:443>
        ServerAdmin webmaster@localhost
        #DocumentRoot /var/www/html
        DocumentRoot /home/ubuntu/apache_docroot

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #for flask
        LoadModule wsgi_module /home/ubuntu/.local/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
        WSGIDaemonProcess hello user=ubuntu
        WSGIScriptAlias /tegaki_api /home/ubuntu/apache_docroot/tegaki_api/hello.wsgi

ServerName example.com
SSLCertificateFile hogehoge.pem
SSLCertificateKeyFile fugafuga.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>

在WSGIDaemonProcess中,添加以下代码以确保由用户ubuntu来运行名为hello的Flask应用程序(即将创建)。

: 一旦完成后,可以将设置应用并重新启动apache以验证.wsgi文件的行为。命令是

cd /etc/apache2/sites-enabled
sudo a2dissite 000-default-le-ssl.conf
cd ../sites-available/
sudo a2ensite 000-default-le-ssl.conf
sudo /etc/init.d/apache2 restart

没问题。

安装flask

终于要安装Flask了。
这非常简单。(如果不使用虚拟环境)只需要以下命令即可。

easy_install flask

容易!

用Flask创建应用程序

我将创建一个Flask的部分。将下面的代码作为hello.py保存在/home/ubuntu/apache_docroot/yourapp目录下。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!!!!"

if __name__ == '__main__':
    app.run()

更改wsgi文件。

当URL被触发时,决定其行为的实体变为了Flask框架,因此需要修改.wsgi文件。

import sys
sys.path.insert(0, '/home/ubuntu/apache_docroot/yourapp')
from hello import app as application

如果能够在前面设定通过路径可以导入hello.py,并且可以使用名为”application”的方式进行导入,那就可以了。

如果你重启apache,那么就可以了。

curl https://example.com/yourapp

基于结果,Content内

Hello World!!!!

会显示。

请提供更多背景信息,并指明您需要改写的原文是什么。谢谢!

Apache2.4安全性-禁止目录列表显示方案
利用[Python] mod_wsgi在Apache上运行Python3.6(CentOS 6系列)

bannerAds