flask+nginx+gunicorn+supervisor云部署系统全步骤以及出现的问题解决链接

一.将项目上传至服务器

pycharm同步服务器和本地源码参考此处 链接

二.项目环境配置

1.安装python3,pip3,virtualenvwrapper。参考此处 链接

之后的操作都要在virtualenvwrapper创建的虚拟环境中设置喔

workon 虚拟环境名  # 进入虚拟环境

2.在创建单环境的时候,可在原环境导出requirements.txt,然后在新环境内安装。参考此处 链接

pip 安装时可能出现的错误:

1. Error: pg_config executable not found 参考此处链接

2. Command “python setup.py egg_info” failed with error code 1 参考此处链接

3. WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 参考链接 参考链接

3.psycopg 安装链接 链接2

当安装完新版openssl,用openssl --version查看版本信息时,若还是旧版本的信息,可能是有其它的openssl文件夹。
which openssl 查看一下当前使用的 openssl文件路径。
若出现其它文件夹,如:

 /root/anaconda2/bin/openssl

例子: mv /root/anaconda2/bin/openssl /root/anaconda2/bin/openssl.bak 先备份文件夹
然后创建软连接,将新版的openssl路径链接到上面的路径

ln -s /usr/local/openssl/bin/openssl  /root/anaconda2/bin/openssl  

这样就能使用和看到新版的信息了。

4.解决"mysql.h" no such file or directory 参考链接

5.安装较新版本的postgresql(可选) 链接
链接2

三.nginx和gunicorn配置

PS:以下内容中出现的 project 均代表你的项目名称。

(一) gunicorn配置

安装gunicorn

pip install gunicorn

这里先创建一个手动导入环境变量的wsgi.py脚本(这里根据个人项目,有所不同。单app直接用app.py就行。)

import os
from dotenv import load_dotenv

dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
if os.path.exists(dotenv_path):
    load_dotenv(dotenv_path)

from project import create_app
app = create_app('production')

启动gunicorn

1. 手动命令启动

gunicorn -w 4 -b 0.0.0.0:8000 wsgi:app

-w 为指定数量的worker进程。
-b 为设置监听的本机端口地址。
wsgi:app 为 包含程序实例的模块 : 变量名

2.创建配置文件启动

 #-*- coding: utf-8 -*-
"""
这个gunicorn.py文件来对gunicorn作配置。
"""
workers = 2    # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent"   # 采用gevent库,支持异步处理请求,提高吞吐量(可选)
bind = "0.0.0.0:80"   # 监听的端口地址

之后在shell中输入以下命令即可启动

gunicorn -c gunicorn.py wsgi:app

如何重启guicorn 链接
gunicorn配置https 链接
guicorn官方配置文档 链接

(二) nginx配置 nginx的作用

安装nginx 参考链接

yum install nginx 

设置端口监听转发。将项目的nginx配置文件(project.conf)放置到此目录下

/etc/nginx/conf.d/  # 目标目录
示例: /etc/nginx/conf.d/project.conf

project.conf 的内容:

server{
    listen 80;  # 监听80端口
    server_name 127.0.0.1;  # 此处可填ip也可填域名(项目运行的)
    access_log /var/log/nginx/project_access.log;  # 项目进入日志路径
    error_log /var/log/nginx/project_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;
}

    location /static {  # 这里让nginx帮我们托管静态文件访问
	alias /home/program/static/;  # 加载的项目静态文件地址
	expires 30d;
}
}

Nginx出现403 forbidden (13: Permission denied)报错的四种方法(在日志中查看)
参考链接

出现 No module named 'ConfigParser’
参考链接

文件配置完成后,输入命令测试语法正确性

nginx -t

如果显示正常,则重启nginx 参考链接

service nginx restart

nginx配置ssl的方法(https)

server{
    listen 8080 ssl;  # 监听8080端口(443是默认SSL口,最好用443。)
    server_name 127.0.0.1;  # 此处可填ip也可填域名(项目运行的)
    # 以下为默认配置,搬过去即可。
    ssl_certificate /etc/nginx/conf.d/SSL.pem;
    ssl_certificate_key /etc/nginx/conf.d/SSL.KEY;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    access_log /var/log/nginx/project_access.log;  # 项目进入日志路径
    error_log /var/log/nginx/project_error.log;  # 项目错误日志路径

    location / {  
    # 当访问https://127.0.0.1:8080时,请求被转发到http://127.0.0.1:8000
        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;
}
}

参考 链接 链接

四.supervisor配置

Supervisor 是一个客户端服务器系统,包含有两个程序:

  • Supervisor的server部分称为supervisord。主要负责管理子进程,响应客户端的命令,log子进程的输出,创建和处理不同的事件
  • Supervisor的命令行客户端supervisorctl。它可以与不同的supervisord进程进行通信,获取子进程信息,管理子进程

linux下的supervisor下载

yum install supervisor

当下载完成后,默认配置文件(supervisor.conf 和 supervisord.d)会存在于/etc下面,其中supervisor是我自己创建的,用来存放所有项目配置文件。

[root@localhost etc]# ls | grep supervisor
supervisor
supervisord.conf
supervisord.d

修改项目配置文件夹的导入路径可在 supervisord.conf 中修改

[include]
files = supervisor/conf.d/*.ini  # 这里的意思是导入conf.d文件夹下的所有以.ini结尾的配置文件

例如我的配置文件完整路径

/etc/supervisor/conf.d/project.ini

常用命令

service supervisord start # 启动服务
service supervisord restart # 重启 

supervisorctl # 进入supervisorctl命令行并列出当前所有项目的运行状态
supervisorctl reread # 重新读取配置
supervisorctl update # 更新以便让配置生效
supervisorctl status # 查看所有项目的运行状态
supervisorctl start program_name # 开始项目运行
supervisorctl stop program_name  # 停止项目运行

项目配置表名为 project.ini


```powershell
[program:voice_presentation]
# command是完整的启动项目的命令(用了虚拟环境的话,记得导入的gunicorn是虚拟环境中的gunicorn。)
command=/gunicorn_path -c gunicorn.conf.py wsgi:app
directory=/project_dir  # 项目存放的目录
user=root  # 用户名
autostart=true  # supervisor启动时启动
autorestart=true  # 故障时自动重启
stopasgroup=true
killasgroup=true
loglevel=info

额外的设置(可选)

一. 非root用户也可使用supervisorctl

修改配置文件 /etc/supervisor.conf 的一个地方

[unix_http_server]
file=/var/run//supervisor.sock
chmod=0777  ; 原来是chmod=0700

二. 设置 HTTP 服务

加入如下两行到 /etc/supervisord.conf 中

[inet_http_server]
port = :9001

supervisorctl reload 重新加载配置。打开浏览器输入 http://localhost:9001, 就会看到管理页面了,网页上的功能也很全。

(简洁)参考 链接
(详细)参考 链接

配置supervisor自启动
链接

supervisor的其它功能链接如下

supervisor event 链接
supervisor xml_rpc 链接

你可能感兴趣的:(Flask,linux,nginx,python,linux)