本文是在上一篇 “ Linux操作系统下部署Jenkins环境,数据迁移(备机部署)以及主从节点的配置 ”基础上进行延伸,Jenkins+Django+Nginx+uWSGI才是一套解决方案。
之所采用Django+Nginx+uwsgi的解决方案,是由于python manage.py runserver 0:8081形式启动Django,只适用于环境测试。当退出终端,甚至退出执行python manage.py runserver,就会发现无法对Django进行访问。为了解决这个问题,在企业中都会使用Django+Nginx+uwsgi 的解决方案。
目录
环境准备
Num | Software | Version |
1 | Python | 3.6 |
2 | Django | 1.11.9 |
3 | mysqlclient | 1.3.13 |
4 | Mysql | 5.7 |
5 | Uwsgi | 2.0.17 |
环境部署
说明:本文部署的服务绝大多数,均采用源码编译安装的方式进行。且所使用软件版本,均是编者在自身生产环境下采用的,软件版本视个人情况而言。
Python3.6部署
[-> ~# opt] wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
[-> ~# opt] yum install gcc make openssl-devel pcre-devel zlib-devel sqlite-devel python-devel -y
[-> ~# opt] cd Python-3.6.0
[-> ~# Python-3.6.0] ./configure --prefix=/usr/local make && make install # 如果没有安装gcc make 等包,在编译安装时会出错
如果编译安装后没有pip的用户,可以自行到官网进行下载 https://pypi.org/project/pip/。但其实一般来说,源码编译安装后都会有pip,只是在使用pip的时候,系统默认调用的是 "/usr/bin" 路径下。而我们编译安装的是在 "/usr/local/bin/"路径下。所以,我们可以做个链接到"/usr/bin"下 (ln -s /usr/local/bin/pip /usr/bin/pip)来解决。
如果实在是没有的用户,在下载后,解压后进入到pip文件内使用如下命令进行安装:
[-> ~# opt] tar -xvf pip-18.0.tar
[-> ~# opt] cd pip-18.0
[-> ~# pip-18.0] python setup.py install
Mysql部署
[-> ~# opt] wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
[-> ~# opt] yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
[-> ~# opt] systemctl start mysqld
[-> ~# opt] systemctl enable mysqld
[-> ~# opt] grep password /var/log/mysqld.log # 查看数据库初始化密码
[-> ~# opt] ss -antulp | grep :3306 # 查看数据库是否已启动
Mysql 数据库命令行的基本操作可以网上自行学习,这里就不过多阐述。
Django部署
Django的部署,在编者以往的文章 “ 使用Python、Django、Bootstrap编写Web页面,以及利用ansible-cmdb、ansible等模块,在web界面获取批量服务器配置信息,以及实现批量管理服务器 ”有较为详细的安装部署步骤,不懂的读者可以前去查阅。
在虚拟环境下安装所需要的模块:
(dj_env)[-> ~# dj_env] pip install django==1.11.9
(dj_env)[-> ~# dj_env] pip install mysqlclient==1.3.13
(dj_env)[-> ~# dj_env] pip install uwsgi==2.0.17
(dj_env)[-> ~# dj_env] pip list # 查看列表是否安装成功,成功如下图
Package Version
----------- -------
Django 1.11.9
mysqlclient 1.3.13
pip 18.0
pytz 2018.5
setuptools 28.8.0
uWSGI 2.0.17
新增uwsgi文件:(建议创建在django app 同级目录下)
(dj_env)[-> ~# dj_app] vim uwsgi.ini
# 内容如下:
[uwsgi]
chdir = /opt/dj_app/dj_app # 指定工作目录
socket = 127.0.0.1:8081 # 通过套接字的方式进行访问,端口可因个人实际情况进行修改,
# 如果不想直接写入,可以生成stock文件,然后进行制定
#socket = ./uwsgi.sock # 如果这里使用uwsgi.sock文件,则在nginx.conf文件内的uwsgi_pass文件就必须是soc文件的绝对路径
module=oms.wsgi:application
chmod-socket = 664
static-map=/static=./static # 静态文件路径
master = true # 主进程
vacuum = true # 重启或退出时清理文件
workers = 2 # 子进程数
uid = scon # 指定启动的用户
gid = scon
pidfile = ./uwsgi8081.pid # 创建pid进程文件,主要用于启动、停止该进程
daemonize = ./uwsgi8081.log # 启动的日志文件
# 在使用uwsgi --ini uwsgi.ini命令前,建议先使用命令pkill uwsgi,然后使用lsof -i 8081,看下有没有服务占用此端口。如果有则kill掉
(dj_env)[-> ~# dj_app] uwsgi --ini uwsgi.ini # 类似初始化,生成相关文件,从ini文件中获取配置
Nginx服务部署
[-> ~# opt] wget http://nginx.org/download/nginx-1.11.2.tar.gz
[-> ~# opt] tar -xvf nginx-1.11.2.tar.gz
[-> ~# opt] cd nginx-1.11.2
[-> ~# nginx-1.11.2] ./configure --prefix=/usr/local/nginx --with-http_ssl_module
[-> ~# nginx-1.11.2] make && make install
启动Nginx服务
[-> ~# opt] ln -s /usr/local/nginx/sbin/nginx /sbin/nginx
[-> ~# opt] nginx # 启动服务
[-> ~# opt] lsof -i 80 # 查看哪个服务占用80端口,然后kill掉
修改Nginx配置文件:
[-> ~# opt] vim //usr/local/nginx/conf/nginx.conf
# 修改为如下:80端口映射多端口
server {
listen 80;
server_name localhost;
location / {
# proxy_pass 127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#uwsgi_pass unix:uwsgi.sock的绝对路径;
uwsgi_pass 129.0.0.1:8081;
include uwsgi_params;
}
}
... ...
server {
listen 80;
server_name www.a.com;
location / {
proxy_pass 127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
[-> ~# opt] ngins -t # 如果出现ok,说明配置文件修改无误,如果有报错,则需要解决
[-> ~# opt] nginx -s reload # 重新加载nginx配置文件
到这里,Django+Nginx+uwsgi 就已经部署完成了,此时我们使用如下命令:
(dj_env)[-> ~# dj_app] uwsgi --ini uwsgi.ini
(dj_env)[-> ~# dj_app] ss -antulp # 查看8081端口是否已经由uwsgi启动,如果是则成功。
最后,访问 “ http://127.0.0.1:8081 ”,就可以看到Django页面的 “ It Work”。
本文旨在提供参考,如有错误,欢迎大家指正。帮助编者不断的改进!