这一篇教程,我们一起来了解如何在Ubuntu系统中将Django2的Web项目部署到Nginx服务器。
首先,大家可以参考《Django2:Web项目开发入门笔记(13)》先完成以下准备工作。
- 安装Ubuntu系统并更新apt-get
- 安装Python3.6与依赖
- 安装Django2.0.3
- 安装Sqlite3与依赖
- 安装OpenSSL等相关依赖
也就是说,除了Apache2和mod_wsgi之外全部都需要安装。
完成上述内容的安装之后,再将项目文件放入/var/www
目录中,我们就可以开始Nginx的安装了。
一、安装Nginx和依赖
执行命令:
sudo apt-get install nginx
sudo apt-get install libpcre3 libpcre3-dev
二、安装uwsgi
执行命令:
cd /usr/local/lib/python3.6/site-packages/
sudo python3.6 pip install uwsgi
三、测试uwsgi
先在/var/www
目录中创建一个测试文件。
执行命令:
sudo chmod 777 /var/www
cd /var/www
sudo vi mytest.py
在VI编辑器中,我们输入测试文件的代码。
示例代码:
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b'UWSGI Test...']
代码输入完毕,按“ESC”键并键入“:wq”回车,保存测试文件后,进行测试。
执行命令:
sudo uwsgi --http :8888 --wsgi-file mytest.py
通过本机浏览器访问“http://127.0.0.1:8888”或者“http://localhost:8888”进行测试,如果页面中显示“UWSGI Test…”字样,则说明测试成功,uwsgi可以正常工作了。
如果,重复测试时,提示端口被占用,可以先将已启动的进程关闭。
先通过名称查询相关进程,然后通过“kill”命令将进程关闭。
执行命令:
sudo ps -ef|grep uwsgi
sudo kill -9 [端口号]
也可以使用“killall”命令通过名称关闭全部相关进程。
sudo killall -9 uwsgi
如果命令无效,可以先获取“root”权限,再进行尝试。
四、配置Nginx
首先,我们为项目添加配置文件。
执行命令:
sudo vi /etc/nginx/sites-available/MyWeb.conf
在VI编辑器中写入配置文件内容。
server { listen 80; # 监听端口 server_name www.qqtbb.com; # 服务器名(多个域名用逗号分隔) charset utf-8; # 服务器字符集 client_max_body_size 5M; # 上传文件最大限制 location /media { # 媒体文件位置 alias /var/www/MyWeb/media; } location /static { # 静态文件位置 alias /var/www/MyWeb/static; } location / { # 为uwsgi协议提供支持(实现与uWSGI服务器通信) uwsgi_pass 127.0.0.1:8888; #为uWSGI服务器设置监听地址(套接字或sock文件) # uwsgi_pass unix:///var/www/MyWeb/MyWeb.sock; # 使用sock文件 include /etc/nginx/uwsgi_params; # 为uwsgi请求增加参数。 } }
内容输入完毕(使用时请先清除注释),按“ESC”键并键入“:wq”回车保存,然后将配置文件的快捷方式添加到/etc/nginx/sites-enabled/
目录中,激活配置文件。
执行命令:
sudo ln -s /etc/nginx/sites-available/MyWeb.conf /etc/nginx/sites-enabled/MyWeb.conf
然后,重启Nginx服务器或者让服务器重新加载配置文件。
重载配置命令:
sudo service nginx reload
重启服务命令:
sudo service nginx restart
如果重载配置文件或者重启服务器发生错误,需要检查配置文件是否有效。
语法检查命令:
sudo service nginx configtest
注意,语法检查只是检查是否配置文件中语法全部正确,并不能排除配置项是否存在问题。
接下来,我们启动uWSGI服务器测试一下项目是否能够正常运行。
执行命令:
sudo uwsgi --http :8888 --chdir /var/www/MyWeb --module MyWeb.wsgi
通过本机浏览器访问“http://127.0.0.1:8888”或者“http://localhost:8888”进行测试,如果项目页面访问正常,则说明配置文件
五、使用配置文件启动uWSGI服务器
uWSGI服务器也可以通过配置文件进行启动,不但避免使用过长的命令,而且能增加更多的配置。
执行命令:
cd /var/www/MyWeb
sudo vi uwsgi.ini
配置文件内容:
[uwsgi] socket = 127.0.0.1:8888 # 监听地址(套接字或sock文件) # socket=/var/www/MyWeb/MyWeb.sock # 使用sock文件 chdir = /var/www/MyWeb/ # 项目根目录 wsgi-file = MyWeb/wsgi.py # wsgi文件路径 processes = 3 # 开启的工作进程数 threads = 5 # 每个工作进程的线程数 chmod-socket = 664 # 客户端访问MyWeb.sock文件的权限 chown-socket = www-data # 客户端请求的所有者 pidfile= /var/www/MyWeb/MyWeb.pid # 保存进程文件的路径 vacuum = true # 服务器退出时自动删除sock文件和pid文件
内容输入完毕(使用时请先清除注释),按“ESC”键并键入“:wq”回车保存,然后就可以通过配置文件启动uWSGI服务器了。
启动命令:
sudo uwsgi --ini uwsgi.ini
停止命令:
sudo uwsgi --stop MyWeb.pid
重载配置:
uwsgi --reload uwsgi.ini
六、使用Supervisor管理uWSGI
Supervisor是一个进程管理工具,能够方便我们对uWSGI服务器进行管理,并能够在uWSGI服务器意外关闭时,重新启动uWSGI服务器。
不过,目前Supervisor没有Python3的版本,我们需要使用Ubuntu系统自带的Python2进行安装。
如果没有安装pip,则需要先安装pip。
执行命令:
sudo apt-get install python-pip
接下来,安装Supervisor。
执行命令:
sudo pip install supervisor
安装完毕后,创建配置文件。
执行命令:
sudo echo_supervisord_conf > /etc/supervisord.conf
打开配置文件,并添加配置。
执行命令:
sudo vi /etc/supervisord.conf
配置内容:
[program:MyWeb] # 这里的“MyWeb”是启动/停止/重启项目时使用的名称 command=uwsgi --ini /var/www/MyWeb/uwsgi.ini # 启动uWSGI服务器的命令 directory=/var/www/MyWeb/ # 项目根目录 startsecs=10 # 进程持续运行多长时间认为启动成功 stopwaitsecs=10 # 向进程发出关闭信号后等待系统返回“SIGCHILD”信号的时间 stopasgroup=true # uwsgi.ini中启动了多个进程时设置此项为true,否则可以删除。 killasgroup=true # uwsgi.ini中启动了多个进程时设置此项为true,否则可以删除。 autostart=true # uWSGI随Supervisord启动 autorestart=true # uWSGI进程意外关闭后自动重启
内容输入完毕(使用时请先清除注释),按“ESC”键并键入“:wq”回车保存。
尝试启动Supervisor。
执行命令:
sudo supervisord -c /etc/supervisord.conf
此时,极有可能发生错误:unix:///tmp/supervisor.sock no such file。
这是因为配置文件中,默认将“supervisor.sock”文件存入/tmp/
目录所导致的。
再次打开配置文件并修改以下内容:
- /tmp/supervisor.sock 修改为/var/run/supervisor.sock (有两处需要修改)
- /tmp/supervisord.log 修改为/var/log/supervisor.log
- /tmp/supervisord.pid 修改为/var/run/supervisor.pid
接下来,在修改后的目录中创建“supervisor.sock”文件,并给予读写权限。
执行命令:
sudo touch /var/run/supervisor.sock
sudo chmod 777 /var/run/supervisor.sock
再次启动Supervisor,又会发生错误:Unlinking stale socket /var/run/supervisor.sock
这次的错误是因为缺少依赖。
执行命令:
sudo apt-get install aptitude
sudo aptitude install python-meld3
安装完依赖,继续尝试启动Supervisor,此时还可能产生错误:Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
这是因为已经有“supervisor.sock”文件被链接(上一次启动Supervisor造成的)。
我们需要先查找哪个“supervisor.sock”文件被链接了。
执行命令:
sudo find / -name supervisor.sock
结果中会显示链接的文件,例如:/run/supervisor.sock
然后,通过“unlink”命令取消查询到的链接。
执行命令:
sudo unlink /被链接文件的所在路径/supervisor.sock
到这里,我们应该就能够正常启动Supervisor对uWSGI进行管理了。
启动项目命令:sudo supervisorctl -c /etc/supervisord.conf start [配置文件中的项目名称]
重启项目命令:sudo supervisorctl -c /etc/supervisord.conf restart [配置文件中的项目名称]
停止项目命令:sudo supervisorctl -c /etc/supervisord.conf stop [配置文件中的项目名称]
控制所有项目:sudo supervisorctl -c /etc/supervisord.conf <start/restart/stop> all
转载请注明:魔力Python » Django2:Web项目开发入门笔记(16)