准备服务器以用Python发布Web应用程序

美好的一天,哈布罗夫斯克!

有空闲时间,并且渴望制作一个小型Web应用程序。有一个想法(从天气传感器接收数据,将其存储在数据库中,然后做一些有趣的事情),也是一个在centos上的免费服务器。关于设置的教程似乎也一样。但是在撰写本文时,还没有找到一个完全可以正常工作的教程如果您还想使用python3 CentOS 7.4服务器上部署应用程序*捆绑包,uwsgi和nginx,欢迎使用cat。

因此,本文应该已经涵盖了什么,而将不会涵盖什么:

  1. 运行CentOS 7.4的物理或虚拟服务器(不保证其他操作系统和版本的性能)。
  2. 使用超级用户特权访问服务器*如果服务器是虚拟的,则假定存在通过SSH连接到服务器的能力。

以root用户身份连接后,第一步是创建一个具有管理员权限的新用户(这不是必需的,但至少要有一个良好的基调):

adduser developer
passwd developer

在这里您需要输入并确认用户密码

usermod -aG wheel developer

将用户添加到本地管理员组

su - developer

切换到新创建的用户。

现在准备环境:

sudo yum install -y epel-release
sudo yum install -y python3 python3-pip python3-devel nginx gcc
sudo yum update -y python36 python2
sudo yum groupinstall -y "Development Tools" "Development Libraries"
sudo yum install -y python3-devel python36-virtualenv

我想提请注意倒数第二行- “开发工具”“开发库”对于正确启动虚拟环境必需的。我们使用标志,以便团队完成而不要求确认。

现在,您可以开始创建工作目录:

sudo mkdir /opt/myproject && cd /opt/myproject
sudo chown -R developer /opt/
python3 -m venv myprojectenv
source myprojectenv/bin/activate

pip3 install --upgrade pip
pip3 install uwsgi flask

现在,我们

vi /opt/myproject/wsgi.py准备该Web应用程序的入口点:(以下,我将使用vi编辑器,但这只是一个问题)

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return ["<h1 style='color:blue'>Testing Success!</h1>"]

启动后的这段代码将使我们能够确保之前采取的所有步骤均成功。要测试,请运行该服务:

uwsgi --socket 0.0.0.0:8080 --protocol=http -w wsgi

通过物理ljcnegt或rdp连接,可以在浏览器中以0.0.0.0:8080检查结果。通过SSH连接,打开一个新会话并使用curl测试:

curl -v 0.0.0.0:8080

-v标志使您可以查看完整的输出。

测试完成后,您应按CTRL + C终止服务(否则,您必须查找进程并用kill杀死它。这也是退出,但绝对不太方便)。

现在,您可以制作主要的Web应用程序:

vi /opt/myproject/myproject.py

from flask import Flask
application = Flask(__name__)

@application.route("/")
def hello():
   return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
   application.run(host='0.0.0.0')

测试过程与上一个非常相似-我们使用命令启动应用程序python3 /opt/myproject/myproject.py并进行检查。结果应该是相同的。

现在编辑入口点,以便在调用该入口点时,我们的应用程序启动:

vi /opt/myproject/wsgi.py

from myproject import application

if __name__ == "__main__":
   application.run()

现在最困难也最有趣。是时候使用此应用程序制作服务了,该服务将在后台自动运行。

首先,为uwsgi准备ini文件:

vi /opt/myproject/myproject.ini

[uwsgi]
wsgi-file = myproject/wsgi.py

master = true
processes = 2

uid = developer
socket = /tmp/uwsgi/myproject.sock
chown-socket = nginx:nginx
chmod-socket = 666
vacuum = true

die-on-term = true

在这里,我要注意以下几行:

  1. socket = /tmp/uwsgi/myproject.sock-为了加快服务速度,您应该使用unix-socket,为了让nginx连接到它,请在临时文件夹/ tmp / uwsgi中创建它
  2. chown-socket = nginx:nginx会将套接字使用权转让给nginx用户
  3. chmod-socket = 666-与上一个目的相同。不同的手册和技巧具有不同的参数值-664、665、777-但通过实验确定666是最低工作水平。

现在,您可以直接继续创建服务:

sudo vi /etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve myproject app
After=network.target

[Service]
ExecStartPre=-/usr/bin/bash -c 'mkdir -p /tmp/uwsgi chown nginx:nginx /tmp/uwsgi'
ExecStart=/usr/bin/bash -c 'cd /opt/myproject; source myprojectenv/bin/activate; uwsgi --ini myproject.ini'
ExecStartPost=/usr/bin/bash -c 'setenforce 0'
PrivateTmp=false
[Install]
WantedBy=multi-user.target

所有有趣的行都在Service块中:

  1. ExecStartPre是系统管理员在启动服务之前将执行的命令。

    -/ usr / bin / bash -c宣布下一个命令序列的开始,“ mkdir -p / tmp / uwsgi chown nginx:nginx / tmp / uwsgi”为套接字创建一个临时文件夹,并将权限转移给nginx用户。
  2. ExecStart是直接启动服务的命令,在该命令中,我们将依次进入工作目录,激活虚拟环境并从ini文件启动uwsgi-server。
  3. ExecStartPost-服务启动后运行的命令。在我们的情况下,需要将请求从Nginx服务器正确传输到uwsgi服务器。
  4. PrivateTmp = false是使创建的临时文件夹对其他进程可见的参数。

现在运行服务:

systemctl start myproject
systemctl status myproject
systemctl enable myproject

服务器重启后,最后一条命令将使其自动启动。

最后一个问题-我们将配置nginx服务器,并使我们的Web应用程序可用于外部网络。始终可以使用以下命令查看他的工作日志

journalctl -u  myproject

sudo vi /usr/lib/systemd/system/nginx.service

找到[Service]块,最后添加PrivateTmp = false。

之后,使用命令重新启动守护程序,systemctl daemon-reload

现在我们直接进行服务器配置:

vi /etc/nginx/nginx.conf

http {
    . . .

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 80 default_server;

        . . .

找到http块并添加新服务器:

server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi/myproject.sock;
    }
}

现在仍然可以打开服务器并在防火墙上编辑规则:

systemctl start nginx
systemctl enable nginx

firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https

firewall-cmd --reload

现在,通过域名或IP地址访问服务器时,我们将收到Flask应用程序的响应。

我希望这些材料会有用。

All Articles