Django本地项目部署到云服务器

Django本地项目部署到云服务器

开发环境

开发语言: Python
后台框架:Django
web服务器:nginx
wsgi服务器:uwsgi

云服务器系统:Ubuntu

查看本地项目Django和Python版本:

(可以直接安装Django最新版本就可以了,Python版本不能低于3.4)

1
2
3
4
5
6
7
8
root@iZwz969jm0y04abuhgx4byZ:/home/projects/closet/closetUsers# python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(2, 1, 4, 'final', 0)
>>>

参考了别家的教程

1. 预备安装

1.1 安装数据库

安装mysql

Ubuntu上的MySQL搭建

1.2 安装Django

安装Django

Django初步使用移步Django系列教程:

Django数据库配置

1.3 安装uwsgi

1.3.1 uwsgi安装

1
root@iZwz969jm0y04abuhgx4byZ:~# python3 -m pip install uwsgi

Successfully installed uwsgi-2.0.17

1.3.2 uwsgi测试

测试 uwsgi 是否正常:

新建 test.py 文件,内容如下:

1
2
3
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "cloestUsers World"

然后在终端运行:

1
uwsgi --http :8001 --wsgi-file test.py

在浏览器内输入:http://127.0.0.1:8001,查看是否有"cloestUsers World”输出,若没有输出,请检查你的安装过程。

1.3.3 uwsgi关闭

1
2
3
4
5
6
7
8
9
10
11
12
13
killall -9 uwsgi # 	强行关闭
# 关闭某一个进程
root@iZwz969jm0y04abuhgx4byZ:/home/projects/closet/closetUsers# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 22256/java
tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 22256/java
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 18840/mysqld
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3044/nginx.conf
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 22256/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 11022/sshd
root@iZwz969jm0y04abuhgx4byZ:/home/projects/closet/closetUsers# kill -9 22256
# 查看哪个要关闭的进程的pid,使用kill -9 <pid>

1.4 安装nginx

1.4.1 安装 Nginx

安装命令如下:

1
2
3
4
5
6
7
8
cd ~
wget http://nginx.org/download/nginx-1.11.0.tar.gz
tar xf nginx-1.11.0.tar.gz
cd nginx-1.11.0
./configure --prefix=/usr/local/nginx-1.11.0 \
--with-http_stub_status_module \
--with-http_gzip_static_module
make && make install

你可以阅读 Nginx 安装配置 了解更多内容。

1.4.2 测试nginx

查看nginx是否安装成功,查看nginx的版本:

1
2
root@iZwz969jm0y04abuhgx4byZ:/home/projects/closet/closetUsers# nginx -v
nginx version: nginx/1.10.3 (Ubuntu)

在/home/projects目录下新建一个test目录,在里面添加一个简单的html文件。然后在nginx.conf中简单配置:

1
2
3
4
5
6
7
8
events{}
http{
server{
server_name www.sukamay.xyz; # 域名或者ip地址
root /home/projects/test;
index index.html;
}
}

启动该nginx:(启动之前,要将/usr/local/nginx/mime.types文件复制到该nginx.conf所在目录,并且必须使用绝对路径)

1
nginx -c /home/projects/test/nginx.conf

如果端口被占用,则先释放该端口,则使用lsof -i :8082查看占用端口进程的pid,并使用kill -9 [pid]关闭相应的进程。

若想要关闭所有nginx打开的进程,可使用:

1
killall -9 nginx

在浏览器中访问自己的域名http://www.sukamay.xyz,访问成功。(域名要先做好dns解析)

1.4.3 关闭nginx

1
2
nginx -s stop
# or /etc/init.d/nginx stop

2. 在线项目部署

部署本地Django项目到服务器,结合uwsgi+Django+nginx。

2.1 项目代码上传到服务器

clone本地项目代码到服务器/通过ftp复制项目到服务器

我使用的是scp

1
2
xxxdeMacBook-Pro:~ xxx$ scp -r /Users/xxx/Desktop/closet/closetUsers root@120.76.62.132:/home/projects/closetTest1.0
# pattern: scp <option> <local_file_path> root@<server_ip_address>:<goal_file_path>

在我的项目目录/home/projects里创建一个closet目录,并在里面创建一个conf目录,用来存放配置文件,这样分离开来,方便更新维护项目代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@iZwz969jm0y04abuhgx4byZ:/home/projects# tree -L 3
.
├── closet
│   ├── closetUsers
│   │   ├── closetUsers
│   │   ├── jsonTest
│   │   ├── manage.py
│   │   ├── __pycache__
│   │   ├── static
│   │   ├── users
│   └── conf
│   ├── mime.types #copy from /usr/local/nginx/conf
│   ├── nginx.conf #configure file of nginx
│   ├── uwsgi.ini #configure file of uwsgi
│   └── uwsgi.log
└── closetTest1.0
└── closetUsers
├── closetUsers
├── manage.py
└── users

13 directories, 10 files

2.2 修改项目代码

2.2.1 修改settings.py:

1
2
3
4
DEBUG = False   # Django是否加载静态资源
ALLOWED_HOSTS = ['localhost','127.0.0.1','120.76.62.132'] # 允许访问的主机地址

STATIC_ROOT = os.path.join(BASE_DIR, "static/") # 收集Django的静态文件到同一个static中

2.2.2 创建uwsgi.ini和uwsgi.log

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
25
26
27
root@iZwz969jm0y04abuhgx4byZ:/home/projects/closet/conf# vim uwsgi.ini 

# closet uwsgi.ini file
[uwsgi]

socket = 127.0.0.1:8002
# http = :8002 如果不通过nginx可以直接用http,但要通过web服务器就必须要用socket
# http = 127.0.0.1:8002

# the base directory (full path)
chdir = /home/projects/closet/closetUsers

# Django's wsgi file
module = closetUsers.wsgi

# process-related settings
# master
master = true

# maximum number of worker processes
processes = 4

# clear environment on exit
vacuum = true

processes = 4
"uwsgi.ini" 29L, 549C 1,0-1 Top

2.2.3 创建nginx.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
root@iZwz969jm0y04abuhgx4byZ:/home/projects/closet/conf# vim nginx.conf 

http{
include mime.types;
server{

listen 80;
# server_name www.sukamay.xyz;
server_name 120.76.62.132;
index index.html ;
root /home/projects/closet/closetUsers;
charset utf-8;

location /static {
alias /home/projects/closet/closetUsers/static; # your Django project's static files - amend as required
}

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

/usr/local/nginx/conf/mime.types文件copy到conf下

2.3 创建数据库、收集静态文件

1
2
python manage.py migrate 
python manage.py collectstatic

2.4 启动服务

启动nginx

1
nginx -c /home/projects/closet/conf/nginx.conf

后台启动uwsgi

1
uwsgi /home/projects/closet/conf/uwsgi.ini -d /home/projects/closet/conf/uwsgi.log

访问 http://120.76.62.132/ (我没写默认index.html,访问的是http://120.76.62.132/users/)可以看到接口写好的返回内容, 则创建成功

3. error summary

给咱来个🍰,啾咪