阿里云服务器双十一搞活动,趁机低价入手了一只,但是把我的Django框架搭建起来的项目部署上去的时候遇到很多的问题,自己摆弄了一个星期,总算把部署流程搞清楚了,在此做下记录,供后人参考。
一、概念
开始部署之前最好先了解下相关概念,所谓知其然知其所以然
Django: 一个MVC架构的Web框架, 自带wsgi和server功能
Uwsgi: 一个高性能的cgi中间件,也提供Web服务器功能
nginx: 一个免费开源并且高性能的HTTP服务器和反向代理
Django 和 Uwsgi 都提供服务器功能,的确nginx并不是必须,但是要部署到生产环境,需要考虑到某些情况
1 、安全问题:程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。
2、负载均衡问题:一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
3、静态文件问题:用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。
另外,Django虽然自带服务器功能,但性能不佳,仅仅用于测试开发阶段;uWsgi的服务器性功能没研究过,但它主要是一个Web服务器网关接口,服务器性能不是它的强项
二、安装uwsgi
pip install uwsgi
安装完成后,下面来测试是否安装成功。上面说了uwsgi也能提供web服务功能,所以咱们创建一个test.py文件,然后启动uwsgi,在游览器中验证uwsgi是否运行成功,相关代码如下:
pip install uwsgi //安装
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi //添加软链,以便在任何目录使用uwsgi
# 新建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 --http :8000 --wsgi-file test.py //8000端口随意设定
然后我们可以在远程服务器的游览器里打开127.0.0.1:8000,或者自己本地的游览器中打开xx.xx.xx.xx:8000(公网IP:8000),显示hello world,证明安装成功。
三、uwsgi配置
在目录/home/www下创建jcdemo项目,然后创建一个jcapp
cd /home/www
django-admin startproject jcdemo
cd jcdemo
python manage.py startapp jcapp
在项目根目录下创建uwsgi配置文件
cd /home/www/jcdemo
mkdir script //创建存放pid、log文件的路径
vim jcdemo_uwsgi.ini //创建jcdemo_uwsgi.ini文件,把一下内容复制进去
[uwsgi]
socket = 127.0.0.1:9001 #内部端口,自定义
chdir = /home/www/jcdemo #项目根目录
module = jcdemo.wsgi #wsgi文件路径,wsgi文件是随创建项目的时候生成在
master = true
processes = 4
vacuum = true
pidfile =/home/www/jcdemo/script/uwsgi.pid #生成pid文件
daemonize = /home/www/jcdemo/script/UWSGI.log #生成日志文件
:wq保存
三、nginx安装和配置nginx.conf
cd /opt //源码安装的时候我一般把源码下载到这个路径
wget http://nginx.org/download/nginx-1.13.7.tar.gz //下载
tar -zxvf nginx-1.13.7.tar.gz //解压
cd nginx-1.13.7
./configure
make && make install //nginx一般默认安装好的路径为/usr/local/nginx,
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx //添加软链,以便在任何目录使用nginx
在/user/local/nginx/conf/中打开nginx.conf,做以下修改
server {
listen 8080; #暴露给外部访问的端口
server_name localhost;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9001; #这个端口要和jcdemo_uwsgi.ini里socket保持一致,外部访问8080就转发到内部9001
}
location /static/ {
alias /home/www/jcdemo/static/; #项目静态路径设置
}
}
(以上内容请保证在默认内容的大括号内,:wq保存)
四、启动项目
进入到项目目录下,依次执行以下三个命令:
uwsgi --ini jcdemo_uwsgi.ini //加载uwsgi配置
pkill -9 nginx //强制停止nginx服务
nginx //启动nginx服务
补充:
1 启动:
2 uwsgi --ini 配置文件路径 如:--ini uwsgi.ini
3 uwsgi --ini uwsqi.ini # ini启动(路径注意)
uwsgi -x uwsqi.xml # xml 启动
4 停止
5 uwsgi --stop uwsqi.pid #(路径注意)
6
7 # 查看日志
8 tail -f uwsgi.log
9
10 # uwsgi.log 和 uwsqi.pid 都是uwsgi启动后自动生成的有时候不知道原因没有生成 uwsqi.pid 想要停止项目可以先找到进程再杀掉
11
12 # 检查 进程
13 ps --aux |grep uwsgi
好了,现在就可以在本地游览器访问你的django项目了
在游览器中打开47.100.196.111:8080/admin(47.100.196.111为你的服务器公网地址)
点关注,不迷路,谢谢!
网友评论