3
年前阿里云打折,1核1G的云服务器一年只要300多块,果断就租了1年的。既然服务器已经到手,怎么能不把自己写的项目部署上去呢,其实网上关于nginx+uwsgi部署Django项目的文章有很多,但是这些文章要不就是很久之前的,要不就是互相抄袭,一路过来都是坑,这里重点吧在部署时候遇到的坑着重介绍一下:

1.首先部署django项目

首先是django项目,由于我是使用Anaconda来进行版本控制的,而django项目是在Python2.7环境下开发的,首先是新建一个Python2.7的环境:

#创建python27环境
conda create --name python27 python=2.7
#激活该环境
source activate python27
#通过conda安装django
conda install django

环境准备好后,从GitHub上将项目拉取下来

git clone https://github.com/sunny0826/xxx

修改setting.py文件

#debug模式默认开启,这里要关闭
DEBUG = False
#这里将外网IP配置进来
ALLOWED_HOSTS = ['127.0.0.1','xx.xx.xx.xx']

启动项目:

#来项目目录下执行
python manage.py runserver 8000

然后在外网ip:8000路径下查看项目启动情况

2.阿里云配置安全组

由于是服务器在阿里云上,所以直接访问时访问不到的,所以要在阿里云平台配置安全组(类似于防火墙)

首先打开阿里云平台,登录,点击安全组配置:

clipboard.png

点击配置规则

clipboard.png

点击添加安全组规则

clipboard.png

按要求填写安全组规则

clipboard.png
优先级1位最高优先级,端口可以设置范围,并且可以设置授权访问的对象
设置完之后,就可以在公网IP访问到我们的django项目了

3.安装配置uwsgi

确定django项目可以正常运行了,ctrl+c停止项目,下面我们来安装uwsgi:
在安装uwsgi非常简单,只需要pip安装即可,但是由于之前使用的是Python27环境,这里记得要激活Python27环境,否则就安装到默认的Python路径了

#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端口,这里偷懒就不去配置新的安全组了
那么问题就来了,在启动的时候报错了....=。=

clipboard.png

出现的这个错误,经过测试只会在Python2.7的环境发生,在Python3+就没有发生了,辗转百度和Google,都没有找到这个问题的解决办法且这个问题一般发生在nginx上...
但这个报错问题还是很明显,就是libpcre.so.1这个文件找不到,初步推测为版本问题
首先要咱们搜索一下这个文件,看看本机有没有

clipboard.png

发现本机是有这个文件的,那就好办了,将他链接到相应位置就好

clipboard.png

执行这条语句之后就可以uwsgi就可以正常启动了

在跳过这个坑之后,就可以正式来配置我们的项目了
首先修改自己项目中的wsgi.py文件,添加两行代码

clipboard.png

然后在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 主进程号

clipboard.png

来停止uwsgi,然后才能重启,注意这里的主进程是pid为1的进程,而配置了pid文件的,只需要进行如下方法来重启即可

#重载(一般修改参数,或者修改py文件经常用到)
uwsgi --reload uwsgi.pid
#重启(一般系统环境变化会用到)
uwsgi --stop uwsgi.pid

最后在项目根目录下运行uwsgi命令,载入配置文件

uwsgi --ini uwsgi.ini

然后在后面的日志中要注意环境是否为之前配置,如果不是请激活激活之前创建的Python环境再进行操作

4.安装配置nginx

最后来安装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


郭西西
60 声望10 粉丝

DevOps 工程师,专注云原生及容器领域