Centos6.9+Python3+Nginx+Uwsgi+Django2.0

0x00 前言

本文为 Centos6.9+Python3+Nginx+Uwsgi+Django2.0 下的部署方法,该方法不太适合纯小白直接粘贴复制,因为部分操作需要稍微修改为自己源码环境下路径才可以。

0x01 正文

可能是菜吧,花费了一下午和一晚上,踩了N个坑,才成功搭建完成。

  1. 更新源

yum update -y

  1. 安装软件管理包和可能使用的依赖

yum -y groupinstall “Development tools”

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

  1. 下载Pyhton3到 /usr/local 目录

切换到 /usr/local 目录,获取python3.6的压缩文件

执行命令:
wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz

  1. 解压python3.6

tar -zxvf Python-3.6.6.tgz

  1. 安装python3.6

A)执行命令: ./configure –prefix=/usr/local/python3
注意:/usr/local/python3 路径可以自己指定

B)安装python3
a)执行命令: make
b)执行命令: make install

C)安装完成之后,建立软链接,添加变量,方便在终端中直接使用python3
a)python3的软连接
执行命令: ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
b)pip3的软连接
执行命令: ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3
c)查看python和pip的版本
执行命令: python3 和 pip3 -V

  1. 设置 pip 国内源

永久性设置,是在用户根目录(,而非系统根目录 / )下添加配置/.pip/pip.conf目录添加可信源,如果目录文件不存在,可直接创建。
[root@localhost ~]# cd
[root@localhost ~]# mkdir .pip
[root@localhost ~]# cd .pip
[root@localhost .pip]# vim pip.conf
写入如下内容
[global]
index-url=http://pypi.douban.com/simple
trusted-host = pypi.douban.com
加上trusted-host防止pip报警。

  1. 安装virtualenv ,建议大家都安装一个virtualenv,方便不同版本项目管理

执行命令: pip3 install virtualenv
建立软连接:
执行命令: ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
在根目录下建立两个文件夹,主要用于存放env和网站文件的(个人习惯,其它人可根据自己的实际情况处理)
执行命令: mkdir -p /data/env 和 mkdir -p /data/wwwroot

  1. 切换到/data/env/下,创建指定版本的虚拟环境

执行命令 : cd /data/env 切换目录
执行命令: virtualenv –python=/usr/bin/python3 pyweb

  1. 进入/data/env/pyweb/bin,启动虚拟环境

执行命令: cd /data/env/pyweb/bin
进入环境: source activate
退出环境: deactivate
注意:出现(pyweb),说明是成功进入虚拟环境

  1. 虚拟环境里安装Django和uwsgi

执行命令: pip3 install django 注意:如果用于生产的话,则需要指定安装和你项目相同的版本
执行命令: pip3 install uwsgi

给uwsgi建立软链接:
执行命令: ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

  1. 下载或安装 Django 项目

git clone https://github.com/shiyan-520/django_blog.git

or

创建 Django 项目

  1. Centos系统自带的sqlite3版本偏低,需要升级到 SQLite 3.8.3 或以上版本

切换到 /usr/local 目录,获取 SQLite 3.8.3更高版本 的压缩文件

下载高版本:wget https://www.sqlite.org/snapshot/sqlite-snapshot-201911030007.tar.gz

解压安装包:tar -zxvf sqlite-snapshot-201911030007.tar.gz

设置安装目录:./configure –prefix=/usr/local/sqlite3

编译和安装:make && make install

查找当前系统中其它版本软件:find /usr/ -name sqlite3

把旧版本的移到一个新的目录中:mv /usr/bin/sqlite3 /usr/bin/sqlite3_old

设置软连接:ln -s /usr/local/sqlite3/bin/sqlite3 /usr/bin/sqlite3

查看当前版本是否新的版本:sqlite3 –version

共享库修改,注意修改为sqlite的安装路径地址:
vim ~/.bashrc
export LD_LIBRARY_PATH=”/usr/local/sqlite3/lib”

修改完成后,进行重启电脑,然后查看是否配置成功:
python3

1
2
3
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.31.0'
  1. 此时在virtualenv里运行Django博客可能出现以下错误

错误提示:django.db.utils.NotSupportedError: URIs not supported

解决方案是,使用vim打开提示报错的那个文件并找见报错的那一行,把 URI 对应的 True 改成 Flase 。

  1. 本地预览一下项目是否能正常使用

python3 manage.py makemigrations

python3 manage.py migrate

python3 manage.py runserver –insecure

  1. 项目正常运行,准备配置 uwsgi

创建 django_blog.xml文件,用于相关配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(pyweb) [root@localhost django_blog]# touch django_blog.xml
(pyweb) [root@localhost django_blog]# ll
总用量 208
drwxr-xr-x 5 root root 4096 119 17:30 about
drwxr-xr-x 5 root root 4096 119 17:30 blog
-rw-r--r-- 1 root root 167936 119 19:42 db.sqlite3
-rw-r--r-- 1 root root 0 119 19:50 django_blog.xml
drwxr-xr-x 5 root root 4096 119 17:30 index
-rw-r--r-- 1 root root 542 119 17:30 manage.py
drwxr-xr-x 5 root root 4096 119 17:30 Posts
-rw-r--r-- 1 root root 920 119 17:30 README.md
-rw-r--r-- 1 root root 37 119 17:30 requirements.txt
drwxr-xr-x 3 root root 4096 119 17:30 sh1yanblog
drwxr-xr-x 4 root root 4096 119 17:30 static
drwxr-xr-x 2 root root 4096 119 17:30 templates
drwxr-xr-x 5 root root 4096 119 17:30 yqlj

uwsgi配置参数详解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
master = true
#启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。

chdir = /web/www/mysite
#在app加载前切换到当前目录, 指定运行目录

module = mysite.wsgi
# 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块

py-autoreload=1
#监控python模块mtime来触发重载 (只在开发时使用)

lazy-apps=true
#在每个worker而不是master中加载应用

socket = /test/myapp.sock
#指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字

processes = 2 #启动2个工作进程,生成指定数目的worker/进程

buffer-size = 32768
#设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。

daemonize = /var/log/myapp_uwsgi.log
# 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器

log-maxsize = 5000000 #设置最大日志文件大小

disable-logging = true #禁用请求日志记录

vacuum = true #当服务器退出的时候自动删除unix socket文件和pid文件。

listen = 120 #设置socket的监听队列大小(默认:100)

pidfile = /var/run/uwsgi.pid #指定pid文件

enable-threads = true
#允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程

reload-mercy = 8
#设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)

max-requests = 5000
#为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏

limit-as = 256
#通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。

harakiri = 60
#一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)

然后在xml文件中,进行设置:

vim django_blog.xml

1
2
3
4
5
6
7
<uwsgi>
<socket>127.0.0.1:8080</socket><!-- 内部端口,自定义 -->
<chdir>/data/wwwroot/django_blog/</chdir><!-- 项目路径 -->
<module>sh1yanblog.wsgi</module>
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize><!-- 日志文件 -->
</uwsgi>
  1. 安装nginx和配置nginx.conf文件

wget http://nginx.org/download/nginx-1.17.5.tar.gz

tar -zxvf nginx-1.17.5.tar.gz

nginx一般默认安装好的路径为/usr/local/nginx

a)执行命令: cd nginx-1.17.5.tar.gz 进入nginx-1.17.5.tar.gz文件夹

b)执行命令: ./configure

第一次安装 nginx 时,可能会提示“ make: *** 没有规则可以创建“default”需要的目标“build”。 停止。”在 make 的时候。
这个时候就要安装一些依赖包:

yum install pcre-devel zlib zlib-devel openssl openssl-devel
./configure

c)执行命令: make

d)执行命令: make install

  1. 进入 /usr/local/nginx/conf 目录,打开nginx.conf文件

a)执行命令: cd /usr/local/nginx/conf 进入目录

b)执行命令: vim nginx.conf 在server里编辑以下内容:

1
2
3
4
5
6
7
8
9
10
11
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8080;
uwsgi_param UWSGI_SCRIPT sh1yanblog.wsgi;
uwsgi_param UWSGI_CHDIR /data/wwwroot/django_blog;

}
location /static/ {
alias /data/wwwroot/django_blog/static/; #静态文件目录
}

c)执行命令: cd /usr/local/nginx/sbin 进入 /usr/local/nginx/sbin/ 目录

d)执行命令: ./nginx -t

e)执行命令: ./nginx

  1. 访问项目的页面

进入虚拟机环境目录下:cd /data/env/pyweb/bin/

启动虚拟机:source activate

进入Django源码路径:cd /data/wwwroot/django_blog/

启动 xml 服务:uwsgi -x django_blog.xml

进入Nginx目录:cd /usr/local/nginx/sbin/

重启服务器:./nginx -s reload 重启nginx

打开浏览器访问 本机IP地址的80端口即可。

  1. 重启 uwsgi 方法

ps -ef | grep uwsgi

kill xxxx xxxx xxxx xxxx

uwsgi django_blog.xml

cd /usr/local/nginx/sbin/

./nginx -s reload

  1. 解决Django admin 后台无法渲染静态文件问题

进入 settings.py 文件中,添加:

STATIC_ROOT = os.path.join(BASE_DIR, ‘static’)#指定样式收集目录

然后执行下面命令

python3 manage.py collectstatic

  1. 开启和关闭博客

uwsgi 相关:

开启:

cd /data/wwwroot/django_blog/

uwsgi django_blog.xml

关闭:

ps -ef | grep uwsgi

kill xxxx xxxx xxxx xxxx

nginx 相关:

cd /usr/local/nginx/sbin/

开启:

./nginx

关闭:

./nginx -s stop

重启:

./nginx -s reload

0x03 结束语

部署上线,踩的坑是真的多,各种报错,磕磕盼盼才成功上线,O(∩_∩)O哈哈~


Centos6.9+Python3+Nginx+Uwsgi+Django2.0
https://sh1yan.top/2019/11/09/Django-deployment-method-one/
作者
shiyan
发布于
2019年11月9日
许可协议