年前阿里云打折,1核1G的云服务器一年只要300多块,果断就租了1年的。既然服务器已经到手,怎么能不把本身写的项目部署上去呢,其实网上关于nginx+uwsgi部署Django项目的文章有不少,可是这些文章要不就是好久以前的,要不就是互相抄袭,一路过来都是坑,这里重点吧在部署时候遇到的坑着重介绍一下:
首先是django项目,因为我是使用Anaconda来进行版本控制的,而django项目是在Python2.7环境下开发的,首先是新建一个Python2.7的环境:php
#建立python27环境 conda create --name python27 python=2.7 #激活该环境 source activate python27 #经过conda安装django conda install django
环境准备好后,从GitHub上将项目拉取下来html
git clone https://github.com/sunny0826/xxx
修改setting.py文件python
#debug模式默认开启,这里要关闭 DEBUG = False #这里将外网IP配置进来 ALLOWED_HOSTS = ['127.0.0.1','xx.xx.xx.xx']
启动项目:nginx
#来项目目录下执行 python manage.py runserver 8000
而后在外网ip:8000路径下查看项目启动状况git
因为是服务器在阿里云上,因此直接访问时访问不到的,因此要在阿里云平台配置安全组(相似于防火墙)github
首先打开阿里云平台,登陆,点击安全组配置:
点击配置规则
点击添加安全组规则
按要求填写安全组规则
优先级1位最高优先级,端口能够设置范围,而且能够设置受权访问的对象
设置完以后,就能够在公网IP访问到咱们的django项目了django
肯定django项目能够正常运行了,ctrl+c中止项目,下面咱们来安装uwsgi:
在安装uwsgi很是简单,只须要pip安装便可,可是因为以前使用的是Python27环境,这里记得要激活Python27环境,不然就安装到默认的Python路径了vim
#uWSGI 是一个(巨大的) C 应用,因此你须要一个 C 编译器(好比 gcc 或者 clang)和 Python 开发版头文件 apt-get install build-essential python-dev #安装uwsgi pip install uwsgi
按照官网介绍,写已经Python脚本进行测试,test.py(在任意路径均可以,不过测完要记得删掉)安全
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return ["Hello World"]
而后输入命令进行测试服务器
uwsgi --http :8000 --wsgi-file test.py
这里是8000端口,由于以前测试django的时候打开的8000端口,这里偷懒就不去配置新的安全组了
那么问题就来了,在启动的时候报错了....=。=
出现的这个错误,通过测试只会在Python2.7的环境发生,在Python3+就没有发生了,展转百度和Google,都没有找到这个问题的解决办法且这个问题通常发生在nginx上...
但这个报错问题仍是很明显,就是libpcre.so.1这个文件找不到,初步推测为版本问题
首先要我们搜索一下这个文件,看看本机有没有
发现本机是有这个文件的,那就好办了,将他连接到相应位置就好
执行这条语句以后就能够uwsgi就能够正常启动了
在跳过这个坑以后,就能够正式来配置咱们的项目了
首先修改本身项目中的wsgi.py文件,添加两行代码
而后在django项目根目录建立uwsgi.ini文件
uwsgi.ini文件配置
# uwsgi.ini file [uwsgi] # Django-related settings socket = 127.0.0.1:8000 #与nginx通讯的地址和端口 # the base directory (full path) chdir = /apps/xxxx #django项目绝对路径 # Django s wsgi file module = xxxx.wsgi #wsgi文件所在的相对于项目的路径 # the virtualenv (full path) home = /root/anaconda3/envs/python27/lib/python2.7/site-packages #python环境的路径 # process-related settings # master master = true # maximum number of worker processes processes = 4 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true plugins=python #log文件 daemonize=/apps/uwsgi/uwsgi.log #pid文件 pidfile=/apps/uwsgi/uwsgi.pid
这里配置日志文件和pid文件,方便以后的重启
关于uwsgi的重启问题:
每次项目有代码更新的话,都须要重启uwsgi,若是没有配置pid文件的话,重启须要使用:
#查看uwsgi进程号 ps aux | grep uwsgi #关闭进程号为0的进程 kill -9 主进程号
来中止uwsgi,而后才能重启,注意这里的主进程是pid为1的进程,而配置了pid文件的,只须要进行以下方法来重启便可
#重载(通常修改参数,或者修改py文件常常用到) uwsgi --reload uwsgi.pid #重启(通常系统环境变化会用到) uwsgi --stop uwsgi.pid
最后在项目根目录下运行uwsgi命令,载入配置文件
uwsgi --ini uwsgi.ini
而后在后面的日志中要注意环境是否为以前配置,若是不是请激活激活以前建立的Python环境再进行操做
最后来安装nginx
sudo apt-get install nginx
修改nginx配置
cd /etc/nginx/sites-enabled #Ubuntu中nginx配置文件所在路径 vim default
配置文件
server { listen 80 default_server; #监听端口,未来访问的端口 listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; server_name _; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; #uwsgi中配置的路径 } location /static { alias /apps/xxx/static; #静态资源路径 } location /resume.ico { alias /apps/xxx/static/resume.ico; #网页图标路径 } }
uwsgi启动后,再启动nginx
基础命令
/etc/init.d/nginx start #启动 /etc/init.d/nginx stop #关闭 /etc/init.d/nginx restart #重启
启动以后,访问外网IP:80,查看是否能够经过nginx访问django