nginx+uwsgi在阿里云Ubuntu上部署django项目
主要参考:https://www.django.cn/article/show-22.html
主要记录一下容易忘记的操作和一些遇到的错误,这些东西搞了整整一晚上,与上面提到的参考相同的操作就不再写了。
在纯净的Ubuntu系统上安装依赖包
-
更新操作系统和安装依赖包
-
安装Python3和PIP3
-
分别建立放虚拟环境和项目的文件夹
-
安装virtualenv
虚拟环境 这一部分操作不太熟悉,记录一下
#指定Python版本,并创建一个叫pyweb的虚拟环境
sudo virtualenv -p /usr/bin/python3 pyweb
#进入虚拟环境
source /data/env/pyweb/bin/activate
#退出虚拟环境
deactivate
- 上传项目并安装依赖
用Xftp把项目上传,并按安装Django和Restframework
#安装django
pip3 install Django==1.11.8
#安装restframework
pip3 install djangorestframework
安装uwsgi
sudo pip3 install uwsgi
现在系统中安装一遍,再进入虚拟环境安装一次
安装成功之后,我们进入项目根目录/data/wwwroot/my_blog/新建一个 my_blog.xml文件,在里面输入代码:
<uwsgi>
<socket>127.0.0.1:8000</socket>
<chidr>/data/wwwroot/my_blog/</chidr> <!-- 项目路径 -->
<module>my_blog.wsgi</module>
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>
安装Nginx
/usr/local 目录执行下面命令下载nginx源码:
wget http://nginx.org/download/nginx-1.13.7.tar.gz
然后解压它:
tar -zxvf nginx-1.13.7.tar.gz
cd 进入解压后的nginx-1.13.7文件夹,依次执行以下命令:
sudo ./configure
sudo make
sudo make install
进入/usr/local/nginx/conf/目录,改写nginx.conf文件:
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 80;
server_name xxxxxxx;
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_param UWSGI_SCRIPT my_blog.wsgi;
uwsgi_param UWSGI-CHDIR /data/wwwroot/my_blog/;
}
location /static/ {
alias /data/wwwroot/my_blog/static/;
}
}
}
在/usr/local/nginx/sbin/目录下操作nginx
#检查配置文件
./nginx -t
#运行nginx
./nginx
#重新载入nginx配置
./nginx -s reload
#关闭nginx
./nginx -s quit
运行nginx之前必须启动uwsgi,否则就会发生502错误
cd /data/wwwroot/mysite/
uwsgi -x mysite.xml
遇到的问题即解决
-
502 Bad Gateway
502错误的发生查资料都说是php的原因,可是我的项目并没有用到php,后来发现,因为uwsgi用的是8000端口,所以我在runserver时会提示8000端口被占用,所以我就杀掉了所有的8000端口程序sudo fuser -k 8000/tcp
,这样就会把uwsgi的进程杀掉,所以再访问就会出现502错误。解决方法是用别的端口来runserver,python3 manage.py runserver 8001
-
400 Bad Request
这个发生的原因是django项目里的setting文件没有设置对,项目同名文件里的setting文件要把调试模式关掉,并写上ALLOWED_HOSTS
DEBUG = False
ALLOWED_HOSTS = ['xx.xx.xx.xx','www.xxxxx.com',]
- 另一个很傻的错误
我的项目主页上是没有网页的,要在后面在 / 一个目录才有,这个直到我回到我Ubuntu虚拟机里打开了一遍才想起来,这样输入域名/xxx,就可以在外网访问我的Django项目啦。