部署环境要求
1、centos7 64位(CentOS Linux release 7.5.1804 (Core))
2、Python2.7 (系统自带了)和Python3.6.5
3、Mysql == 5.7.18
4、Django==2.0.1
5、mysqlclient==1.3.12
6、uWSGI==2.0.15
7、nignx==1.13.7
为了降低出现bug的机会,请尽量使用的一样的环境
安装好系统后可以使用如下命令将系统更新到最新
sudo yum update
sudo yum upgrade
安装原理
- 首先客户端请求服务资源,
- nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
- 如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
- 如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
- wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
- wsgi将返回值进行打包,转发给uWSGI,
- uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
注:不同的组件之间传递信息涉及到数据格式和协议的转换
作用:
- 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
- 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
- uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
- django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。
进入正题,一行命令,一行注释,使用root身份登录系统执行
1、安装各类基础模块
yum -y install gcc-c++(为centos系统增加编译功能)
yum -y install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel mariadb-devel
(安装这些模块都是为了成功编译安装python3,防止出现各种异常)
yum install libxml* (安装这个模块是为了让uwsig支持使用“-x"选项,能通过xml文件启动项目)
2、编译安装python3
进入home路径(本人喜欢把东西都下载到这里),执行以下命令:
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
下载完成后,执行解压命令:
tar -zxvf Python-3.6.5.tgz
进入解压后的Python-3.6.5文件夹,依次执行以下命令
./configure --prefix=/usr/local/python3
(将python3安装到/usr/local/python3/路径下)
make -j2 (此选项用于开启多少内核编译,用于提高效率)
make install -j2 (此选项用于开启多少内核安装,用于提高效率)
mv /usr/bin/python /usr/bin/python.bak(备份python2的连接)
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3(以上两个ln命令是为了方便在终端中直接使用python3和pip3命令)
pip3 install --upgrade pip(升级pip)
最后修改yum对python2的配置:
vim /usr/bin/yum
将#! /usr/bin/python修改为#! /usr/bin/python2
vim /usr/libexec/urlgrabber-ext-down
将#! /usr/bin/python 也要修改为#! /usr/bin/python2
这样python 2.X和3.X便同时存在了,并且以3为主!
3、安装Virtualenv
3.1 安装virtualenv
pip3 install virtualenv
3.2 使用python3指定虚拟目录
如果您有数据盘,那么建议您创建到数据盘中(linux数据盘重新挂载教程),本次教程使用的目录为: /var/www/目录下
cd /var/www/ #进入到 /var/www/ 中
virtualenv -p /usr/bin/python gdcj #指定python3创建虚拟目录gdcj
如果python位置不同可以使用,下面的命令,查找python的位置
which python
which python3
3.3 配置程序需求环境
使用命令进入虚拟目录,然后安装项目配置环境。
cd /var/www/gdjcj #gdcj为python3创建虚拟目录
source bin/activate #激活虚拟目录
pip3 install -r requirements.txt # 安装原项目的环境配置
注:以下内容未申明退出虚拟目录,均在虚拟目录中运行。如遇到权限不够,请在命令前加上sudo
注意:我在安装时出现了如下的错误提示:Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-97z4efug/mysqlclient/
4、M(MariaDB)
首先安装数据库M,但是需要注意下的是,CentOS 6之前的版本中提供了MySQL安装包,但是在CentOS 7.X已经用MariaDB替代了MySQL。而MariaDB实际上是MySQL的一个分支,所以MariaDB完全兼容MySQL,包括API和命令行,所以这里的LNMP的M是就是MariaDB:
yum install mariadb mariadb-server -y
yum install MySQL-python -y
注意这里使用的是yum不是pip,-y表示直接下载完成后直接安装。
安装完毕后对数据库进行初始化:
systemctl start mariadb.service
mysql_secure_installation
mysql -uroot -p密码
create database mysite;
exit
systemctl enable mariadb.service
第一行表示启动mariadb服务,第二行表示进入初始化(可以设置管理员密码),第三行表示用的root账号和设置的密码登录,第四行则是创建一个名为mysite的数据库。第五行是将mariadb服务加入到自启动。
5、安装uWSGI
不要在虚拟环境中安装uWSGI
,
5.1、安装:
pip install uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
5.2、测试uWSGI:
新建文件test.py,写入以下内容
def application(env, start_response):
start_response('200 OK',[('Content-Type', 'text/html')])
#return ['Hello world'] # Python2
return [b'Hello world'] # Python3[root@localhost pro]#
5.3、运行
sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py
5.4、调试
如果端口占用,使用
lsof -i :80001
列出占用端口的程序的pid号,并使用以下命令杀掉所有占用端口的程序
sudo kill -9 pid1
#如果使用pid文件
sudo uwsgi --stop uwsgi.pid
然后浏览 http://127.0.0.1:8000(或http://内网ip:8000、或http://外网ip:8000)查看效果,有”Hello World”输出即安装成功。
5.5、使用uwsgi测试项目
nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,请参见【uWSGI+django+nginx的工作原理流程与部署历程】[1],我们可以直接使用uwsgi对项目进行测试。在项目目录下生成uwsgi.ini配置文件,如下
# 这句代码必须加上
[uwsgi]
#使用nginx连接时使用
#socket=127.0.0.1:9090
#直接做web服务器使用
http=0.0.0.0:8080
#项目目录
chdir=/home/www/gdcj
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=gdcj/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
在项目中的settings.py文件中将服务器的ip添加
到ALLOWED_HOSTS 配置项中
启动
uwsgi --ini uwsgi.ini
其它命令[2]
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid # 关闭
此时使用在浏览器中输入http://服务器ip:8080即可看到项目的输出,说明配置已经成功。
6、安装nginx
由于新装的centos7中没有nginx的镜像源(参见centos yum 没有可用软件包 nginx。),因为nginx位于第三方的yum源里面,而不在centos官方yum源里面。解决办法如下:
yum install epel-release -y
yum update
yum install nginx -y
同时通过命令将其改开机启动:
systemctl start nginx
6.1、建立工程单独的nginx配置文件
首先确认自己准确的知道nginx的默认配置文件目录(nginx.conf)的路径,如果不清楚,请使用如下命令获取:
nginx -t
大概会列出以下类似信息:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
里面说明了nginx默认配置文件的路径是:/etc/nginx/nginx.conf;
6.2、确保nginx.conf的同目录下有uwsgi_params文件
如:/etc/nginx/uwsgi_params,没有的话根据链接获取, 后面要用到。
6.3、建立自己的nginx配置文件
自己的工程目录下,建立如gdcj.conf(/home/www/gdcj/gdcj.conf)的配置文件;复制nginx.conf里面全部的内容,全部写入destiny.conf中。
然后按照下面写的,把destiny.conf配置文件中的server段部分全部替换掉。
server {
listen 80;
server_name localhost;
charset utf-8;
access_log /home/www/gdcj/nginx_access.log;
error_log /home/www/gdcj/nginx_error.log;
client_max_body_size 75M;
location /static {
alias /wwwroot/destiny/destiny/static;
}
location / {
include /etc/nginx/conf/uwsgi_params;
uwsgi_pass 127.0.0.1:9090;
}
}
其中的 listen 80代表服务器开放80端口;
location [目录名]代表项目路径的引导;
access_log 和error_log是定义nginx访问日志和错误日志的存放路径。
“location /static”中的”/static”是自己定义的项目引用静态文件时,浏览器中显示的静态资源所在的根目录名;这样的话,用户在浏览器中查看到的所有image、css或js资源都是处在http://127.0.0.1/static下的。
django静态文件的绝对路径是根据自己的实际情况来确定的,一般在自己的django的app名/static目录下,或自己python manage.py collectstatic后的路径下。本教程的是在/home/www/gdcj/static根目录下。
“location /”是指访问项目根目录时,nginx要做的事。其中需要指定 uwsgi_params文件的绝对路径,上面已经提到了;如果还有media文件之类的静态目录,仿照static的写法,自己补充。
127.0.0.1:9090是指uWSGI绑定的监听地址,这里使用了9090端口。所以我们要将在测试uwsgi时使用的uwsgi.ini文件修改如下:
# 这句代码必须加上
[uwsgi]
#使用nginx连接时使用
socket=127.0.0.1:9090
#直接做web服务器使用
#http=0.0.0.0:8080
#项目目录
chdir=/home/www/gdcj
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=gdcj/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
6.4、更改静态目录权限归属者
需要注意的是,请确认自己django的静态文件目录所有者是www用户(如果不会建立请看第7步),如果不是,请用以下命令更改静态目录权限归属者:
sudo chown -R www:www /home/www/gdcj/static
6.5、nginx的一些操作(可以不看)[3]
6.5.1、启动
启动代码格式:nginx安装目录地址 -c nginx配置文件地址
例如:
nginx -c /home/www/gdcj/gdcj.conf
6.5.2、停止
1、查看进程号
ps -ef|grep nginx
2、杀死进程
kill -QUIT 进程id
6.5.3、重启
1、验证nginx配置文件是否正确
nginx -t -c /home/www/gdcj/gdcj.conf
看到如下显示gdcj.conf syntax is ok
gdcj.conf test is successful
说明配置文件正确!
2、重启Nginx服务
nginx -s reload
7、centos下配置用户及用户组权限[4]
groupadd www
useradd --shell /sbin/nologin -g www www
8、启动uwsgi和nginx
8.1、启动uWSGI
sudo uwsgi --ini /home/www/gdcj/gdcj.ini
8.2、启动nginx
在这之前,我们要先去nginx配置文件的根目录拷贝mime.types(/etc/nginx/mime.types)到工程目录(/home/www/gdcj/mime.types),和gdcj.conf放在一起。
否则用配置文件启动nginx会报错:
nginx: [emerg] open() "/**/**/**/mime.types" failed (2: No such file or directory)1
当然,如果不想拷贝mime.types文件,也可以将配置文件中“include mime.types;”一项,改成绝对路径“include /etc/nginx/mime.types;”
如果nginx已经开启,先关闭nginx(service nginx stop或nginx -s stop),再执行以下命令:
nginx -c /home/www/gdcj/gdcj.conf
这里的-c 表示加载配置文件启动
9、理一下路径
工程路径: /home/www/gdcj
工程静态文件路径: /home/www/gdcj/static
wsgi.py的路径: /home/www/gdcj/gdcj/wsgi.py
uwsgi.ini的路径: /home/www/gdcj/uwsgi.ini
uwsgi日志路径: /home/www/gdcj/uwsgi.log
destiny.conf的路径: /home/www/gdcj/gdcj.conf
uwsgi_params的路径: /etc/nginx/uwsgi_params
nginx访问日志路径: /home/www/gdcj/nginx_access.log
nginx错误日志路径: /home/www/gdcj/nginx_error.log
几乎把所有有关工程的配置文件和日志文件都放在工程目录下了,方便后期维护与查错。