linux+python3+virtualenv+uwsgi+supervisor+nginx部署Django web发布环境
一、python3源码包安装
首先安装一些编译源码需要的依赖文件
1
yum -y install gcc make cmake zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel
安装python3
1
2
3
4
5
6cd /usr/local/
tar -zxvf Python-3.6.5.tgz # 注意版本
mkdir python3
cd Python-3.6.5
./configure --prefix=/usr/local/python3/
make && make install1
2
3
4
5
6
7
8yum install -y vim # 安装个vim先,vi强化版
vim /etc/profile # 编辑环境变量文件,添加python3的环境变量
PATH=$PATH:/usr/local/python3/bin/
export PATH
source /etc/profile
python3
二、virtualenv创建虚拟环境并安装Django
安装基础环境配置
1
yum groupinstall "Development tools"
安装virtualenv
1
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
创建虚拟环境
1
2cd /home/
virtualenv --python=python3 django_env进入虚拟环境
1
. /home/django_env/bin/activate
虚拟环境中安装django
1
pip install django==2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
创建Django项目
1
2django-admin startproject mywebsite
修改配置文件,允许任意主机访问
1
2vim mywebsite/mywebsite/settings.py
可以测试一下
1
2python3 mywebsite/manage.py runserver 0.0.0.0:8000
看到报错
1
2
3不要慌,这是SQLite版本问题,关闭版本检测即可
vim /home/django_env/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py再次运行
1
2python3 mywebsite/manage.py runserver 0.0.0.0:8000
在本机输入ip:8000,发现仍无法访问,是因为防火墙的原因,这里先关闭防火墙
1
2
3
4
5systemctl stop firewalld.service # 关闭防火墙
systemctl disable firewalld.service # 设置开机默认关闭
python3 mywebsite/manage.py runserver 0.0.0.0:8000 # 运行django项目恭喜你,项目运行了
三、uwsgi安装
以上的运行方式,实际上调用了py内置的socket模块,单进程单线程,效率比较低
使用uwsgi启动django项目,可以支持多线程,且稳定效率高
1 | pip3 install uwsgi |
创建uwsgi配置文件uwsgi.ini
1 | vim /home/django_env/bin/uwsgi.ini |
1 | [uwsgi] |
通过uwsgi启动项目
1 | uwsgi --ini /home/django_env/bin/uwsgi.ini |
浏览器能够正常访问
四、supervisor安装
是一个py开发进程管理工具
作用:可以用它去启动uwsgi,当uwsgi挂掉了,supervisor帮助自动重启,还可以很方便地管理uwsgi进程
安装
1
2
3yum -y install python-setuptools
pip3 install supervisor生成配置文件
1
2echo_supervisord_conf > /etc/supervisord.conf
修改生成的配置文件
1
2vim /etc/supervisord.conf
文件最后追加如下内容
basic 1
2
3
4
5
6
7
8[program:mywebsite]
command= /home/django_env/bin/uwsgi --ini /home/django_env/bin/uwsgi.ini;
autostart=true ;
startsecs=10 ;
autorestart=true ;
stopasgroup=true ;
killasgroup=true ;启动supervisor,同时它会自动把uwsgi启动
1
2supervisord -c /etc/supervisord.conf
可以进入supervisor的终端控制台,进行管理来启动或停止你的项目
1
2supervisorctl -c /etc/supervisord.conf
五、nginx整合
nginx是什么
是一个使用c语言开发的高性能的http服务器和反向代理服务器。
nginx的优点
- 轻量级
- 在应对高并发情况时,能保持低资源低消耗高性能
- 高度模块化的设计,配置简洁
- 官方测试nginx能够支撑5万并发量,并且cpu、内存等资源消耗却非常低,运行非常稳定
nginx的应用场景
- http服务器:Nginx可以独立提供http服务,可以做网页静态服务器
- 虚拟主机:可以实现在一台服务器虚拟出多个网站
- 反向代理,负载均衡
下载安装
下载地址:
http://nginx.org/en/download.html
下载之前为保证不报错,做一些准备
1
2yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel wget
使用wegt下载,版本自己定
1
2wget http://nginx.org/download/nginx-1.18.0.tar.gz
解压nginx
1
2tar -zxvf nginx-1.18.0.tar.gz
切换到nginx-1.18.0目录
1
2cd nginx-1.18.0
执行configure,生成Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi编译安装
1
2make && make install
创建软链接
1
2
3
4
5ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
mkdir -p /var/temp/nginx/
nginx
ps aux | grep nginx验证是否成功,nginx默认80端口
修改nginx配置
1
2vim /usr/local/nginx/conf/nginx.conf
1
2
3
4
5
6
7location / {
# root html;
# index index.html index.htm;
uwsgi_pass 0.0.0.0:8000;
include uwsgi_params;
}启动后,若修改配置,需要刷新,不需要重启nginx
1
2nginx -s reload
此时nginx报error
修改uwsgi配置
不能让用户直接访问项目,要通过nginx跳转过去,利用nginx做反向代理
1
2vim /home/django_env/bin/uwsgi.ini
1
2
3
4# 通过什么访问,用nginx访问时,打开socket注释
socket = 0.0.0.0:8000
# http = 0.0.0.0:8000进入supervisor控制台,重新启动项目
1
2
3supervisorctl -c /etc/supervisord.conf
restart mywebsite查看项目运行状态,可以看出使用80端口访问到了项目,说明nginx做了反向代理
补充:关机下次启动是可能会报
1 | nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory) |
1 | mkdir -p /var/run/nginx/ |