# 介绍

Gunicorn

Gunicorn 是一个 Python 的 WSGI HTTP 服务器。它所在的位置通常是在反向代理(如 Nginx)或者 负载均衡(如 AWS ELB)和一个 web 应用(比如 Django 或者 Flask)之间。它是一个移植自Ruby的Unicorn项目的pre-fork worker模型,即支持eventlet也支持greenlet。 如果对Flask框架还有不清楚的地方,可以查看本文一分钟学会Flask框架的安装与快速使用 Gunicorn启动项目之后一定会有一个主进程Master和一个或者多个工作进程。工作进程的数量可以指定。工作进程是实际处理请求的进程。主进程是维护服务器的运行。

nginx

Nginx是一个高性能的HTTP和反向代理web服务器,所谓的方向代理即使将访问用户a地址,nginx将a地址指向了b地址,即使用户通过a地址访问b地址。

supervisor

Supervisor(Supervisor: A Process Control System)是用Python开发的一个client/server服务,,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。我们在shells上运行gunicorn时候或者其他,只要我们一退出shell,这个进程就会杀死。所以需要这个框架来守护我们运行的gunicorn.保证网站系统不被关闭。

前期准备

在搭建前我们需要准备项目所要的环境,首先在开始这前我们需要创建新的用户来搭建环境,因为使用root不安全,一般不使用root.

# 添加用户

adduser 新用户名

# 为创建的新用户设置密码

passwd 新用户名

# 将新用户添加超级权限组

usermod -aG wheel 新用户名

# 切换新用户

su 新用户名

# 安装wget便于下载软件

sudo yum install -y wget

在创建密码的时候输入密码不显示,将用户添加到wheel用户组下,wheel用户组为管理组,

python环境搭建

首先下载python包到我们新用户目录下的src文件下,这个目录需要我们先创建

# 创建/home/新用户名/src目录

mkdir ~/src

# 进入目录

cd ~/src

# 下载python文件

wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz

#安装可能需要的依赖

sudo yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

# 解压文件且进入目录

tar -zxvf Python-3.6.9.tgz

cd Python-3.6.9

# 编辑配置文件--prefix是python的安装目录

./configure --prefix=/usr/local/python3

make

make install

# 建立软连接,(Python与pip都建立软连接,分别为python3、pip3与系统自带的Python2区分)可以使用命令`ls -l /usr/bin/查看软连接是否已创建成功`

ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3

ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

# 配置环境变量,打开配置文件,添加配置

vi ~/.bash_profile

#添加以下配置信息(第一个是python安装路径)

export PYTHON_HOME=/usr/local/python3

export PATH=$PYTHON_HOME/bin:$PATH

#最后执行以下命令使配置生效

source ~/.bash_profile

#可以使用以下命令查看配置是否成功,输出python安装路径即是成功

echo $PYTHON_HOME

配置SFTP

在将本地项目部署到云服务器的时候,我们需要将文件项目进行上传到云服务器 ,这里我选择简单的上传方式,采用软件FileZilla Client进行上传,也可以使用xFTP软件。以FileZilla Client这个软件为例,新建站点且配置参数

协议选择sftp或者ftp主机为服务器地址,端口默认为sftp:22,ftp:21登录类型可以选择密码或者密钥文件 用户为服务器用户名 配置完成连接成功后可以直接将项目拉到服务器   这里将项目拉到用户apps目录下,需要我们自己创建 mkdir -p ~/apps 创建虚拟环境 但我们将项目上传的服务器部署是,我们需要配置虚拟环境,因为一个服务器不止一个项目,以免环境冲突。 # 进入项目目录

cd ~/apps/djangoproject/

# 安装虚拟配置工具

pip3 install virtualenv

# 创建虚拟环境,venv为虚拟环境名,在这下会创建同名的目录

virtualenv venv

# 激活虚拟环境

source venv/bin/activate 使用 Gunicorn进行生产环境的服务部署 进入项目根目录下安装Gunicorn,这个安装在虚拟环境下的 pipenv install gunicorn

# 通过gunicorn运行django,这个可以不运行,因为我们推出shell后这杀死这个进程了

gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000 启动 Nginx 服务器进行服务代理

# 安装Nginx

sudo yum install epel-release -y

sudo yum install nginx -y

# 启动Nginx服务:

sudo systemctl start nginx

可能遇到的问题 nginx启动成功后输入ip,无法访问默认的主页(80端口)。 原因: 云服务器未对外开启80端口

配置nginx的服务信息

位于 /etc/nginx/nginx.conf 的nginx.conf文件是nginx服务器的配置信息,包括 Nginx 进程运行时的用户和组(分别为第一个和第二个参数)以及代理的虚拟服务的配置情况等。

/etc/nginx/nginx.conf

# 进程运行的用户和组,这里粗暴地设为root用户和组

user root root;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;

......

http {

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 65;

types_hash_max_size 2048;

include /etc/nginx/mime.types;

default_type application/octet-stream;

# Load modular configuration files from the /etc/nginx/conf.d directory.

# See http://nginx.org/en/docs/ngx_core_module.html#include

# for more information.

# 其他服务器的配置文件的存放地址

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

# 一个默认的服务器配置

server {

listen 80 default_server; # 监听的端口

listen [::]:80 default_server;

server_name _; # 服务域名/ip

root /usr/share/nginx/html;

# Load configuration files for the default server block.

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

location / { # 访问路径

}

error_page 404 /404.html;

location = /40x.html {

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

}

}

......

配置 项目代理服务信息

# 进入/etc/nginx/conf.d目录

cd /etc/nginx/conf.d

# 新建myBlog.conf配置文件

vim myBlog.conf

配置信息如下:

server {

charset utf-8;

listen 80;

server_name 139.196.xxx.xx;

location /static {

alias /home/wwb/apps/myDjango/blogproject/static;

}

location / {

proxy_set_header Host $host;

proxy_pass http://127.0.0.1:8000;

}

}

监听80端口(访问ip时的默认端口),server_name为公网ip或域名,访问静态文件路径static_url时,nginx自动到static_root指定的路径下获取文件。访问其他路径时,将请求转发给本机的8000端口,那里运行的是Gunicorn 服务中的 django程序。

#重启nginx让配置生效

sudo systemctl restart nginx

使用Supervisor守护Gunicorn 进程

当前的Gunicorn服务是我们手工启动的,一旦我们退出 shell,服务器就关闭了,博客无法访问。就算在后台启动 Gunicorn,万一哪天服务器崩溃重启了又得重新登录服务器去启动,非常麻烦。为此使用 Supervisor 来管理 Gunicorn 进程,这样当服务器重新启动或者 Gunicorn 进程意外崩溃后,Supervisor 会帮我们自动重启 Gunicorn。

# 安装supervisor

pip3 instal supervisor

# 在用户目录下创建相关文件目录

cd ~/etc

mkdir supervisor

cd supervisor

mkdir var

mkdir log

mkdir conf.d

# 在~/etc目录下生成Supervisor的配置文件

echo_supervisord_conf > supervisord.conf

目录说明

supervisor目录手动创建,其中var 目录下用于存放一些经常变动的文件,例如 socket 文件,pid 文件,log 下则存放日志文件。

可将supervisord.conf文件内容全部替换为以下内容

# [unix_http_server] 版块,设置file的值。

# 即让 socket 文件生成在 ~/etc/supervisor/var/ 目录下。注意 supervisor 不支持将 ~ 展开为用户 home 目录,所以要用绝对路径指定。

[unix_http_server]

file=/home/新用户名/etc/supervisor/var/supervisor.sock ; the path to the socket file

# [supervisord] 板块下的 logfile 和 pidfile 文件的路径,还有 user 改为系统用户,这样 supervisor 启动的进程将以系统用户运行,避免可能的权限问题:

[supervisord]

logfile=/home/新用户名/etc/supervisor/log/supervisord.log ; main log file; default $CWD/supervisord.log

pidfile=/home/新用户名/etc/supervisor/var/supervisord.pid ; supervisord pidfile; default supervisord.pid

user=root ; setuid to this UNIX account at startup; recommended if root

# [supervisorctl] 板块,配置serverurl的值

[supervisorctl]

serverurl=unix:home/新用户名/etc/supervisor/var/supervisor.sock ; use a unix:// URL for a unix socket

# [include] 版块,将 /home/wwb/etc/supervisor/conf.d/ 目录下所有以 .ini 结尾的文件内容包含到配置中来,这样便于配置的模块化管理,和之前 Nginx 配置文件的处理方式是类似的。注意取消行首的`;`注释。

[include]

files = /home/新用户名/etc/supervisor/conf.d/*.ini

autorestart=True

配置项目应用到supervisor

# 进入我们上面设置配置文件路径 /home/新用户名/etc/supervisor/conf.d

su 新用户

cd ~/etc/supervisor/conf.d

# 新建项目配置文件blog.ini

vim blog.ini

##############################################################

# blog.ini配置详情

# 程序名,后续开启关闭进程都使用程序名指代当前应用

[program:myDj]

# 程序需要执行的指令

command=gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000

# 执行指令时到达的路径

directory=/home/新用户名/apps/djangoproject/

# 是否自动启动,遭遇意外自动重启

autostart=true

autorestart=unexpected

# 开启当前应用的用户角色

user=root

# 应用的相关日志

stdout_logfile=/home/新用户名/etc/supervisor/log/myDjango-stdout.log

stderr_logfile=/home/新用户名/etc/supervisor/log/myDjango-stderr.log

##################################################################

# -c 指定 Supervisr 启动时的配置文件。

supervisord -c ~/etc/supervisord.conf

#进入 supervisorctl 进程管理控制台

supervisorctl -c ~/etc/supervisord.conf

#更新配置文件

update

#启动应用

restart myDj

配置数据库

参考文章: Django学习之旅(十二)Nginx+Gunicorn+Supervisor部署Django博客应用以及各种排坑尝试Linux系统上安装python详细步骤【Python】Python创建虚拟环境的三种方式

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。