Centos6.8:Django+uWSGI+Nginx+supervisord部署web服务器
帮团队的公司建个官网,部署服务器的时候采用了腾讯云推荐的Django+uWSGI+Nginx+supervisord
方案,也采用过几个教程,最后发现这两个比较好:
官方教程(无supervisord),英文,怕英文的话太吃亏了。
腾讯云的教程很简洁,推荐下载文字版,且网速好的话不用配置清华源,理论上一次就能成功,但是如果中间哪步出了问题。。。你就需要看看下面的教程了。推荐腾讯云等平台上的“实验室”,如,基于 CentOS 搭建 Python 的 Django 环境,有免费服务器尝试。只是应该不能使用Putty与WinSCP。
文章目录
说明
目标
最后,我们将要实现以下通路:
客户端 <-> 服务器 <-> the socket <-> uwsgi <-> Django
服务器预装环境
- centos 6.8x64,root用户
- python2(不用,后面装python3)
工具说明
推荐下列工具,不会用的自行搜索。
- win10笔记本一台;
- 常用命令.txt;
- putty: 用于连接服务器,支持复制粘贴;
- WinSCP: 可实现一些重要功能——将本机的文件拖拽复制到服务器上+摆脱linux上的vim。
可以说,有了putty和WinSCP,服务器相当于装在你电脑上了。
安装
Nginx
先安装 EPEL 的基础库,再安装Nginx
yum install epel-release -y
yum install nginx -y
启动 Nginx(centos7使用systemctl命令)
service enable nginx
service start nginx
python3.4与pip3
sudo yum groupinstall -y development tools
sudo yum install -y epel-release python34-devel libxslt-devel libxmt2-devel openssl-devel
sudo yum install -y python34
sudo yum install -y python34-setuptools
sudo easy_install-3.4 pip
uWSGI
在python3的虚拟环境下:
yum install gcc -y # 安装 uwsgi 需要编译环境
python3.4 -m pip install uwsgi # 安装 uwsgi
django
推荐配置虚拟环境的方案
正式项目部署时也参考这里的步骤
cd /home/
mkdir django
cd django
python3.4 -m venv venv #后者可换成你喜欢的名字,但这样后面的命令也有改动
创建完成后,进入虚拟环境、安装 Django 、创建项目
source /home/django/venv/bin/activate # 此命名可保存到“常用命令.txt”,
pip install django
django-admin startproject <project_name># 将<project_name>改成你的项目名称,下同,可把/home/django/<project_name>保存到“常用命令.txt”;
cd <project_name>
python manage.py startapp <app_name># 建议用网站名称代替<app_name>,但这个名称不能与项目名称相同。
配置
配置并测试Django
允许域名
使 Django 能处理来做所有域名中的请求,目标文件为/home/django/<project_name>
目录下的settings.py
,这里有两种操作,一种是vim,另一种是WinSCP双击打开,“严重”推荐后者,避免学习vim,方便复制粘贴。
vim my/settings.py
找到
ALLOWED_HOSTS = []
改为
ALLOWED_HOSTS = ['*']
(vim要按i
输入,完后,ecs
键后输入:wq
,再按Enter键)
运行测试
下面测试Django(当前目录在/home/django/<project_name>
)
python manage.py runserver 0.0.0.0:8000
用电脑浏览器访问云主机的 IP 地址,可以看到 Django 的启动页面了。
回到命令行,Ctrl+C断开。
收集静态文件
后面你要处理Django中的static文件,但现在你就可以这样了,先修改/home/django/<project_name>/<project_name>/
下的settings.py
。添加(一般在文末):
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
然后在命令行运行:
python manage.py collectstatic
插播:端口选择
这篇教程里,通常使用8000端口,你也可以使用其他的,但谨慎使用80端口。如果发生端口占用的情况,请谨慎使用下列代码:
lsof -i:80
kill -9 [UID]
首次配置uWSGI
若仍未安装uWSGI,请回到“安装”一节。
基础测试
在/home/django/<project_name>
目录下,创建测试文件test.py
:
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
在命令行中运行uWSGI:
uwsgi --http :8000 --wsgi-file test.py
-
http :8000
:使用http协议,端口8000. -
wsgi-file test.py
:加载特定文件test.py
如果你访问
<你的服务器外网ip或者域名>:8000
,看到"Hello World"字样,便可确认已连接下面通路:
客户端 <-> uWSGI <-> Python
启动Django
下面执行 uwsgi 命令来启动 Django,同样的,更改<project_name>
uwsgi --http :8000 --chdir /home/django/<project_name> --home=/home/django/venv --module <project_name>.wsgi
-
chdir
: 工作目录为/home/django/<project_name>/<project_name>
-
home
:虚拟环境根目录。 -
module <project_name>.wsgi
是指/home/django/<project_name>/<project_name>
目录中的wsgi.py
文件。
执行后,访问云主机,若看到 Django 的启动页面,按下 Ctrl + C,退出进程。
客户端 <-> uWSGI <-> Django
下面我们将使用服务器。
配置Nginx
首次配置Nginx
若未安装Nginx,请回到“安装”一节。确保打开Nginx
service restart nginx
访问<你的服务器外网ip或者域名>:80
——nginx所在的端口,应该会出现“Welcome to nginx!”字样(或502),这意味着:
客户端<->服务器
如果你的服务器的80端口被其他程序占用,Kill掉这个程序,或者更改nginx配置选用其他端口。
再次配置(Configure)nginx
在/home/django/wowuo/
文件下,需要一份uwsgi_params
文件,以备nginx使用
cp /etc/nginx/uwsgi_params /home/django/wowuo/
或者github下载。
在/etc/nginx/conf.d/
目录下创建<project_name>_nginx.conf
文件:
# the upstream component nginx needs to connect to
upstream django {
# server unix:///home/django/<project_name>/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
server {
listen 8000;
server_name <>;
charset utf-8;
client_max_body_size 75M;
location /media {
alias /home/django/<project_name>/media;
}
location /static {
alias /home/django/<project_name>/static;
}
location / {
uwsgi_pass django;
include /path/to/your/mysite/uwsgi_params;
}
}
nginx测试
重启nginx,如果有问题,它会告诉你。
service nginx restart
测试前,添加一个图像,比如media.png,到/home/django/<project_name>/media
中,如果可以访问你的外网ip或域名:8000/media/media.png
,比如,当时我当时用的图片(或许你注意到了图片的地址并没有:8000
,但你的地址现在不能省略:8000
):
nginx、uWSGI、test.py
同样是"Hello World",不一样的说法——这次我们让nginx来说(注意目录):
uwsgi --socket :8001 --wsgi-file test.py
-
socket :8001
:使用uwsgi
协议,8001端口。
这时访问<你的服务器外网ip或者域名>:8000
,如果成功:
客户端 <-> 服务区 <-> the socket <-> uWSGI <-> Python
为什么不是<你的服务器外网ip或者域名>:8001
呢?你可以试试,然后在终端看看报错——体会http协议与uwsgi协议的区别。
改进Socket
我们应该使用Unix socket,而不是刚才那种更简单的。
编辑<project_name>_nginx.conf
,更改这部分
# the upstream component nginx needs to connect to
upstream django {
server unix:///home/django/<project_name>/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
重启nginx。
再次运行uWSGI,注意当前目录:
uwsgi --socket mysite.sock --wsgi-file test.py
这里是事故多发区了,如果你再次访问网站:
如果502?
查看日志,在命令行中输入:
tail -10 /var/log/nginx/error.log
其中一条(…代表省略部分信息)
2018/10/01 11:20:53 [crit] 19766#0: *14 connect() to unix:///home/django/... failed (13: Permission denied) while connecting to upstream, client: 119.2.128.225, server: ..., request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///home/django/...:", host: "www....:8000"
注意 “[crit] ”和“failed (13: Permission denied)”,这代表nginx没有权限打开那个sock文件。
可以尝试这个:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666
如果还不行,请再次检查是不是[crit]错误。如果是,可以把你当前用户加入nginx组中,或直接:(我是后者,因为我使用root用户,用前者略危险)。
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 --chown-socket = nginx:nginx
Django、uwsgi 、nginx
若刚才的步骤正常运行,可先:
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666
"Hello World"变为你的Django项目(或许是个火箭?)
用ini文件配置uwsgi
为简化命令,下面用ini文件配置uwsgi。
在/home/django/<project_name>
目录下创建uwsgi.ini文件,向内粘贴:
[uwsgi]
socket = /home/django/<project_name>/<project_name>.sock
chdir = /home/django/<project_name>
wsgi-file = <project_name>/wsgi.py
plugins = python
virtualenv = /home/django/venv/
processes = 2
threads = 4
chmod-socket = 664
chown-socket = nginx:nginx
vacuum = true
其中
chown-socket = nginx:nginx
为nginx用户和nginx用户组。
再次运行uwsgi
uwsgi --ini mysite_uwsgi.ini
进程守护supervisord(可选)
为了让程序持久运行,可采用supervisord
首先为系统的 Python2 安装上 pip
yum install python-pip -y
安装完成后,我们使用 pip 来安装 supervisord,并输出配置文件
python -m pip install supervisor
echo_supervisord_conf > /etc/supervisord.conf
接下来使用 vim /etc/supervisord.conf
来编辑配置文件,在文件尾部添加如下代码
[program:my]
command=/usr/bin/uwsgi --ini /home/django/<program_name>/uwsgi.ini
directory=/home/django/<program_name>
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true
添加完成后,执行命令启动 Supervisord即可
supervisord -c /etc/supervisord.conf