在阿里ECS上采用Nginx+UWSGI部署Django项目

时间:2021-11-22 20:52:51

1.工作原理

    web客户端(浏览器)<-->Nginx<-->UWSGI(处理动态网页)<-->Django

2.软件版本

    Django==2.0.2

    Python==3.6

    UWSGI==2.0.16

    Nginx == 1.10.3

3.小项目梗概

    

部署过程

1.阿里ECS安全组配置

 入方向开放80/80 8000/8001端口,权限为0.0.0.0/0

2.软件安装

①apt-get

阿里的ECS如果是Ubuntu系统的话,貌似需要apt-get update之后才能用(不知道为什么.......)

②pip

sudo apt-get install python3-pip
sudo pip3 install --upgrade pip

安装完了之后还可以顺手更新一下pip

③uwsgi

sudo pip3 install uwsgi

安装速度相对慢一些

④django

sudo pip3 install django==2.0.2

⑤项目文件

笔者用xftp上传到服务器

3.配置setting.py文件

设置ALLOWED_HOSTS为

ALLOWED_HOSTS = ["*"] 

设置DEBUG = False

DEBUG = False

在末尾加上这两行

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static')

4.配置Uwsgi

/home/lmc/apa(项目目录)下新建两个文件,apa_uwsgi.ini,uwsgi_params

内容如下,其中uwsgi_params的内容是死的,可以从官网上下载

uwsgi.ini

[uwsgi]
chdir = /home/lmc/apa #项目目录
module = apa.wsgi  #项目的wsgi模块(wsgi.py)
master = true  
processes = 10  #同时开启的进程数
socket = :8001  #和nginx通信的端口
chmod-socket = 666 #socket的权限
vacuum =true  #伴随退出环境

uwsgi_params

uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_ADDR $server_addr;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;

5.配置Nginx

在项目目录下新建一个文件apa_nginx.conf

apa_nginx.conf

upstream django{
    server 127.0.0.1:8001;
} #django的数据流,注意端口8001,与前面uwsgi.ini中设置的一致

server{
    listen      80;#监听80端口,HTTP一般都是这个端口,HTTPS另外再说
    server_name  xxx.xxx.xxx.xxx; #这里如果有域名就写域名,没有写阿里ECS公网ip地址
    charset     utf-8;
    client_max_body_size 75M;
    
    location /static {
        alias /home/lmc/apa/static;  #这个很重要,关系到静态文件的是否能够正确传输,项目下python3 manage.py collectstatic可便捷创建static文件
    }

    location / {
        uwsgi_pass django;  #交给django处理
        include /home/lmc/apa/uwsgi_params; #参数表:使用uwsgi_params
    }
}
到这里还不够,还要把apa_nginx.conf交给nginx才行

把/etc/nginx/sties-enabled里的default删了(一个软连接而已)

然后把建立一个和/home/apa/apa_nginx.conf的软连接(实时保持内容一致)

(sudo) cd /etc/nginx/sites-enabled
(sudo) rm default
(sudo) ln -s /home/lmc/apa/apa_nginx.conf

重新加载nginx

(sudo) /etc/init.d/nginx reload
应该显示OK,否则用nginx -t检查一下语法错误

不出意外的话,这时候直接用浏览器输入域名或者IP地址,应该就是这个效果

在阿里ECS上采用Nginx+UWSGI部署Django项目

6.收集静态文件

在项目下执行
python3 manage.py collectstatic

会发现多了一个叫static的文件夹,而且你html文件里所需的静态文件都这正是上面apa_nginx.conf里需求的

7.测试

uwsgi --ini /home/lmc/apa/uwsgi.ini

这时网页应该能够正常访问了

8.设置uwsgi随系统启动并且后台运行

应该发现了,uwsgi不能退出,一退出就无法访问,但是不退出又没法干别的事情而且SSH连接不能关闭,解决办法之一是设置uwsgi开机启动。

(sudo) vim /etc/rc.local

在exit 0上面添上这么一句话:

uwsgi --ini /home/lmc/apa/uwsgi.ini
OK,大工告成