0%

Django + Nginx + Uwsgi部署服务器

Django + Nginx + Uwsgi部署服务器

摘要

写这篇博客主要是为了记录一下自己部署的历程(太艰辛了),同时也为了让其他人能够在看了本博文后能够少走弯路。希望这篇博文能够对大家有所帮助。

环境

本人所使用的环境如下

1
2
3
Ubuntu 18.04.4(腾讯云服务器)
python 3.6(服务器自带)
mysql

环境搭建

在上述环境的基础上进行部署django所需的环境的配置和搭建

首先是pip3的安装,这一步就不再赘述了。

然后是git的安装,直接apt-get install git就行了,主要是为了后面能够从github上clone源码。也可以通过wget 项目地址.zip 下载地址的方式下载项目zip包然后解压。

然后是django所需环境的安装,可以通过虚拟环境的方式安装,也可以直接安装,因为本人是只用在服务器上部署这一个django项目,所以本人直接安装并没有通过虚拟环境,先导出requirements.txt然后在这里安装就可以了

1
pip install -r requirements.txt

mysql的安装也不在这里说了,因为不是重点,大家度娘都能够解决。并且mysql的安装对部署的影响并不大。

然后则是uwsgi的安装了,uwsgi大家可以直接通过pip install uwsgi的方式完成安装,不过请确定是最新版,否则容易出现bug,安装完成后可以测试一下

首先在manage.py同一级目录下创建test.py

1
2
3
4
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return b"Hello World"

然后运行

1
wsgi --http :8000 --wsgi-file test.py

打开<公网ip:8000>看能否访问并看到hello world,如果能看到则没问题

然后是对nginx的安装,同理apt-get install nginx,安装完后,可以通过service --status-all查看niginx前面是否有+号,如果没问题,再访问公网ip,如果出现nginx的欢迎界面,则nginx安装成功

配置

环境安装好了,接下来就是最重要的配置环节了。

首先是对uwsgi的配置,首先在manage.py同级目录下创建uwsgi.ini文件用于配置,配置内容如下

#对应是注释,复制的时候最好把中文删去,省去编码问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[uwsgi]
# Django-related settings
socket = 127.0.0.1:8888

# the base directory (full path) 项目根地址 即manage.py所在目录
chdir = /root/myblog

# Django s wsgi file
module = blog.wsgi:application

# process-related settings
# master 主进程
master = true

# maximum number of worker processes
processes = 4
# buffer-size 这个需要设置一下
buffer-size = 30000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
# 日志文件
daemonize = /root/myblog/mysite.log
vacuum = true

然后是对nginx的配置

首先了解一下nginx的配置文件

1
2
3
主配置文件:/etc/nginx/nginx.conf一般不用动
可用配置文件:/etc/nginx/sites-available我们一般更改这里的配置文件
已用配置文件:/etc/nginx/sites-enabled,已经启用的配置文件 我们在可用配置文件目录,新建一个xxx.conf此文件用于配置我们的项目。xxx可写自己的项目名称
1
2
3
cd /etc/nginx/sites-available
vim xxx.conf
// 如果不是root用户,可能需要先sudo创建文件然后chmod然后再进行vim修改

然后在xxx.conf文件中写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
upstream django {
server 127.0.0.1:8888; # for a web port socket (we'll use this first)
}

server{
listen 80;
server_name 公网ip;
charset utf-8;
client_max_body_size 75M; #上传文件大小限制

# 网站静态文件所在目录
location /static{
alias /root/myblog/static;
}

# 上传文件所在目录
location /media{
alias /root/myblog/media;
}

# 动态文件交给uwsgi处理
location / {
uwsgi_pass 127.0.0.1:8888;
include /etc/nginx/uwsgi_params;
}
}

然后将此文件再sites-enabled中创建一个软连接,表示此配置文件已经启用:

1
ln -s /etc/nginx/sites-available/xxx.conf   /etc/nginx/sites-enabled/xxx.conf

另外我们还需要将启动nginx的用户改为root,要不然会出现403 forbidden的错误。打开/etc/nginx/nginx.conf文件,将第一行中user后面的用户改为root即可。

然后需要对django进行一下小修改

首先是对settings.py中的debug改为false,allowed_host改为[‘*‘]或者[‘公网ip’],这样才能访问到。

然后在最后加入STATIC_ROOT = os.path.join(BASE_DIR,'static'),之后再进入项目执行python3 manage.py collectstatic执行之后就能看到项目中新增了一个static目录,这样nginx就能访问到了,才能正确加载项目的静态文件,否则访问的就是缺失css样式的项目

重启

然后就是将nginx重启服务并且将uwsgi启动的阶段了

1
2
3
sudo service nginx restart 
sudo uwsgi uwsgi.ini
sudo killall -9 uwsgi

第一行是nginx的重启,第二行则是启动uwsgi服务,最后一行是需要关闭uwsgi服务所需要执行的命令

启动uwsgi系统提示

1
[uWSGI] getting INI configuration from uwsgi.ini

则代表启动成功了,现在就可以访问公网ip:8000访问你的项目了

如果出现问题,可查看uwsgi的日志文件,也就是前面所配置的daemonize = /root/myblog/mysite.log,从而帮助找到错误,进而解决。

补充 前端部署

首先本地运行以下命令打包

1
npm run build

然后将生成的dist文件夹拷贝到服务器上的任意一个位置(下面配置)

然后将上文配置好的nginx的配置文件(/etc/nginx/site-available/xxx.conf)再次打开,再加入一个server即可。

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80; # 随意
server_name 公网ip;
root /root/django/dist; # 你自己放dist的路径
location / {
try_files $uri $uri/ @router;
index index.html index.htm;
}
location @router {
rewrite ^.*$ /index.html last; # 防止刷新404
}
}

最后重启nginx服务即配置完毕(比后端好配置多了)

注意

需要注意的点是,uwsgi的socket和nginx里的配置一定要一样,同时不要使用8000端口(不要问我怎么知道的),上文使用的是8888端口,同时需要查看相应端口的防火墙是否已经打开,如果出现问题可以在服务器上通过curl进行本地访问测试。