在阿里云的centos7下通过nginx+uwsgi部署Django

时间:2022-02-27 21:27:05

做这个着实把我坑了一把。照着网上的步骤做下去不是遇到了各种的bug,总之不能全信,要回看error很重要,这样就能get到你要的内容了。

1 安装虚拟环境

虚拟环境不一定要root权限,不过我此次都是用的root操作的。如果用python3 manage.py runserver运行django的话就要root了

# pip3.6 install virtualenvwrapper

# find / -name  virtualenvwrapper.sh
/home/lh/software/Python-3.6.0/bin/virtualenvwrapper.sh

# ln -s /home/lh/software/Python-3.6.0/bin/virtualenvwrapper.sh /usr/bin/      # 用root装的sh脚本不再/user/bin下,需要链接过去

设置环境变量,把下面两行添加到/root/.bashrc里。
export WORKON_HOME=/root/.virtual     # 安装的虚拟环境就在这个目录下
source /usr/bin/virtualenvwrapper.sh

# mkvirtualenv env1  创建虚拟环境   路径就在 /root/.virtual下

# mkvirtualenv -p /home/lh/software/Python-3.6.0/bin/python3.6 env1   创建指定解释器的虚拟环境

$ workon env1  启动虚拟环境 接下来就安装包了,本次用到的包大概下面的这些
pip install future
pip install django-simple-captcha==0.4.6
pip3.6 install  certifi
pip3.6 install  django-pure-pagination
pip3.6 install xadmin
pip3.6 install urllib3
pip3.6 install chardet
pip3.6 install django-import-export
pip3.6 install pillow

$ deactivate  退出虚拟环境

$ rmvirtualenv env1  删除虚拟环境

上面安装包的方式较低效

我们可以通过 pip freeze > requirements.txt 将本地的虚拟环境安装包相信信息导出来

然后将requirements.txt文件上传到服务器之后运行:

pip install -r requirements.txt
安装依赖包

2. django静态文件设置

djano作为生产,需要将settings设置

DEBUG = False

ALLOWED_HOSTS = ["*"]   # 允许所有端口访问

然后在settings中添加下面

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

运行 

(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# python3.6 manage.py collectstatic

这样就将所有的静态文件搜集到staticfiles目录中,这是因为部署到nginx的话需要直接通过nginx来访问静态文件,所以需要将所有的静态文件搜集起来

在阿里云的centos7下通过nginx+uwsgi部署Django

还要修改staticfiles和media目录的权限为777(666也可以)

3. nginx配置

安装:sudo yum install nginx

配置nginx的配置文件有2种方式,我用的第一种,第二种应该也没问题

1. 将  /etc/nginx/nginx.conf 文件复制到你的Django目录下,我放在DjangoDdu/conf目录下的destiny.conf文件,然后将server端替换成下面的

还有要把里面的 user nginx 改成user root; root是我启动的用户名,否则会报403错误。

    server {
        listen       81;    # 是待会你在浏览器中访问的端口
        server_name  localhost;
        charset     utf-8;
        access_log      /home/lh/Pictures/DjangoDdu/conf/nginx_access.log;
        error_log      /home/lh/Pictures/DjangoDdu/conf/nginx_error.log;
        client_max_body_size 75M;

# Django media
 location /media  {
     alias /home/lh/Pictures/DjangoDdu/media/;  # 指向django的media目录
     }

     location /static {
         alias /home/lh/Pictures/DjangoDdu/DjangoDdu/staticfiles/; # 指向django的static目录
         }
    location / {
        include     /etc/nginx/uwsgi_params;
        uwsgi_pass  0.0.0.0:8080;  # 这个一定要和uwsgi.ini文件的端口一致
    }
    }

然后指定启动这个文件 : /usr/sbin/nginx -c /home/lh/Pictures/DjangoDdu/conf/destiny.conf

2 .第二种方式

# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 0.0.0.0:8080; # 这个一定要和uwsgi.ini文件的端口一致
}
# configuration of the server

server {
# the port your site will be served on
listen      81;
# the domain name it will serve for
server_name esc ; # substitute your machine's IP address or FQDN
charset     utf-8;

# max upload size
client_max_body_size 75M;   # adjust to taste

# Django media
location /media  {
    alias /home/lh/Pictures/DjangoDdu/media;  # 指向django的media目录
}

location /static {
    alias /home/lh/Pictures/DjangoDdu/DjangoDdu/staticfiles; # 指向django的static目录
}

# Finally, send all non-media requests to the Django server.
location / {
    uwsgi_pass  django;
    include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
}
}

然后 ln -s /home/lh/prjo/DjangoDdu/conf/nginx/uc_nginx.conf /etc/nginx/conf.d/   没有conf.d目录就新建

启动nginx : /usr/sbin/nginx    这样会顺带启动conf.d目录下的×.conf文件

4. 安装uwsgi

进入虚拟环境 env1

安装uwsgi 

(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# pip install uwsgi

测试uWSGI是否正常,在DjangoDdu目录中创建一个测试用的Python文件uwsgi_test.py

def application(env, start_response):
        start_response('200 OK',[('Content-Type', 'text/html')])
        #return ['Hello world'] # Python2
        return [b'Hello world'] # Python3

在pro项目路径下,基于HTTP协议运行uWSGI,如果uWSGI安装正常的话,可以在浏览器中访问8080端口,看到Hello world字样(确认8080端口是否已经通过阿里云的安全组开发)

(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# uwsgi --http 0.0.0.0:8080 --wsgi-file uwsgi_test.py

测试django项目是否加载成功

(env1) [root@izbp177egh3y2vdv1jodhsz DjangoDdu]# uwsgi --http 0.0.0.0:8080 --chdir /home/lh/Pictures/DjangoDdu/ --module DjangoDdu.wsgi

配置uwsgi的配置文件,你可以防在django项目的第一层或者建个新的目录存放

# mysite_uwsgi.ini file
    [uwsgi]

    chdir           = /home/lh/Pictures/DjangoDdu/
    module          = DjangoDdu.wsgi
    master          = true
    processes       = 10
    # the socket (use the full path to be safe
    socket          = 0.0.0.0:8080
    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    vacuum          = true
    virtualenv = /root/.virtual/env1

    # logto = /tmp/djangoDdu.log

最后,启动uwsgi : uwsgi -i /home/lh/Pictures/DjangoDdu/conf/uwsgi.ini

就可以输入ip访问了。