1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Django项目nginx+gunicorn 部署

Django项目nginx+gunicorn 部署

时间:2020-08-07 13:34:31

相关推荐

Django项目nginx+gunicorn 部署

Django项目利用nginx+gunicorn实现简单部署:

部署前准备:

​ 1 有一台服务器:

​ 2 全新服务器的话,建议创建一个新的用户,不要在root下部署代码.

```

创建一个超级权限的新用户:(wangdengkai 是用我的用户名)

#在 root 用户下运行这条命令创建一个新用户

root@localhost:~# useradd -m -s /bin/bash wangdengkai

# 把新创建的用户加入超级权限组

root@localhost:~# usermod -a -G sudo wangdengkai

# 为新用户设置密码

# 注意在输密码的时候不会有字符显示,不要以为键盘坏了,正常输入即可

root@localhost:~# passwd wangdengkai

切换到创建的新用户

root@localhost:~# su - wangdengkai

# 切换成功,@符号前面已经是新用户名而不是 root 了

wangdengkai@localhost:~$

```

​ 3 新用户创建并切换成功了。如果是新服务器的话,最好先更新一下系统,避免因为版本太旧而给后面安装软件带来麻烦。运行下面的两条命令:

```

wangdengkai@localhost:~$ sudo apt-get update

wangdengkai@localhost:~$ sudo apt-get upgrade

```

接下来就可以安装必要的软件了,这里我们需要用到的软件有 Nginx、Pytohn3、Git、pip 和 virtualenv。

```

wangdengkai@localhost:~$ sudo apt-get install nginx

wangdengkai@localhost:~$ sudo apt-get install git python3 python3-pip

wangdengkai@localhost:~$ sudo pip3 install virtualenv

```

​ 4启动nginx服务:

​ wangdengkai@localhost:~$ sudo service nginx start

部署代码

​ 1 项目配置:

​ Django 项目中会有一些 CSS、JavaScript 等静态文件,为了能够方便地让 Nginx 处理这些静态文件的请求,我们把项目中的全部静态文件收集到一个统一的目录下,这个目录通常位于 Django 项目的根目录,并且命名为 static。为了完成这些任务,需要在项目的配置文件里做一些必要的配置:

```

blogproject/settings.py

# 其他配置...

STATIC_URL = '/static/'

# 加入下面的配置

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

```

STATIC_ROOT 指明了静态文件的收集目录,即项目根目录(BASE_DIR)下的 static 文件夹。

为了安全起见,在生产环境下需要关闭 `DEBUG` 选项以及设置允许访问的域名。打开 settings.py 文件,找到 `DEBUG` 和 `ALLOWED_HOSTS` 这两个选项,将它们设置成如下的值:

```

blogproject/settings.py

DEBUG = False

ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '.']

```

`ALLOWED_HOSTS` 是允许访问的域名列表,127.0.0.1 和 localhost 是本地访问的域名,. 是访问服务器的域名(**换成你自己的域名**)。域名前加一个点表示允许访问该域名下的子域名,比如 、 等二级域名同样允许访问。如果不加前面的点则只允许访问 。

项目还会依赖一些第三方 Python 库,为了方便在服务器上一次性安装,我们将全部依赖写入一个叫 requirements.txt 的文本文件中。激活**本地**的虚拟环境(如果你使用了虚拟环境的话),并进入项目的根目录,运行 `pip freeze > requirements.txt` 命令:

```

(blogproject_env) C:\Users\yangxg\Workspace\blogproject>

pip freeze > requirements.txt

```

这时项目根目录下会生成了一个 requirements.txt 的文本文件,其内容记录了项目的全部依赖。

3 将代码上传到 GitHub

4 创建虚拟环境:(在你的项目目录下)

​ wangdengkai@localhost:~/sites/my_project$ virtualenv --python=python3 venv

​ 注意这里使用 --python=python3 来指定克隆 Python3 的环境。因为 ubuntu 系统默认安装了 Python2,如果不特别指定的话 Virtualenv 默认克隆的是 Python2 的环境。

检查一下虚拟环境是否创建成功,运行 ls 命令列出当前目录下的文件和文件夹,看到v env 这个文件夹说明虚拟环境创建成功。

5接着再从代码仓库把项目代码拉取过来,**把 git clone 后的地址换成你自己的 GitHub 仓库地址!**

```

wangdengkai@localhost:~/sites/my_project$ git clone /django-blog-tutorial.git

```

6激活虚拟环境,再进入到项目根目录,即 requirements.txt 所在的目录,安装项目的全部依赖:

​ $ source venv/bin/activate

​ pip install -r requirements.txt

7收集静态文件:

​ $ python manage.py collectstatic

8 生成数据库:(需要安装或者链接数据库)

​ $ python manage.py migrate

9 创建超级用户:

​ $ python manage.py createsuperuser

简单部署服务器方式:

​ 1 切换到django项目目录下,然后输入一下命令:

​ nohup python manage.py runserver 0.0.0.0:3000 &

复杂部署服务器方式:

​ 1 安装gunicorn

​ 1 进入虚拟环境中,输入一下命令:

​ pip install gunicorn

​ 2 修改nginx配置

​ 1 回到主目录:cd ~

​ 2 编辑nginx配置文件:

​ 1 sudo vim /etc/nginx/nginx.conf

​ 2 添加配置文件内容:在http大括号内添加一下代码,添加时注意缩进:

```

server {

listen 80;

server_name localhost;

location / {

proxy_pass http://0.0.0.0:8000;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

location /media {

alias /root/bookstore/bookstore/static;#你的静态文件的目录

}

location /static {

alias /root/bookstore/bookstore/static; #你的静态文件的目录

}

}

```

​ 3 注释掉 文件中的一下代码:

```

# include /etc/nginx/sites-enabled/*;

```

​ 4 修改第一行代码后面的用户名为ubuntu账户名:

```

user xxxxxx;#你的用户名

```

​ 4.5 重启nginx:sudo nginx -s reload

​ 5 启动项目(2中方式):假设我的django项目名为 bporject.

​ ;

```

1前台启动:gunicorn -w 3 -b 0.0.0.0:8000 bpro.wsgi:application

2后台启动nohup gunicorn -w 3 -b 127.0.0.1:8080 bpro.wsgi:application &

3后台启动:gunicorn -w 3 -b 127.0.0.1:8080 bpro.wsgi:application -D

```

​ 6 然后回车退出命令行,就可以通过ip访问了.

# 自动启动 Gunicorn

- 我用的操作系统是Ubuntu 16.04 LTS,用户是siar,非root用户

## 1. 新建目录(自启动服务文件存放目录)

`sudo mkdir -p /usr/lib/systemd/system`

## 2. 新建文件(自启动的服务文件)

`sudo vim /usr/lib/systemd/system/siar.service`

### 2.1 添加如下内容

```

[Unit]

After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]

# 你的用户

User=siar

# 你的目录

WorkingDirectory=/home/siar/sites/django-blog-learning/blogproject

# gunicorn启动命令

ExecStart=/home/siar/sites/env/bin/gunicorn --bind unix:/tmp/siar.socket blogproject.wsgi:application

Restart=on-failure

[Install]

WantedBy=multi-user.target

```

- 有一些参数我也不是太懂,具体可以参照下面的[systemd.service 中文手册](/systemd/systemd.service.html)链接。

### 2.2 保存并退出

`:wq`

## 3. 启动服务

`sudo systemctl start siar`

- 我的文件名是siar.service,所以就`sudo systemctl start siar`

3.1 停止服务stop

sudo systemctl stop wangdengkai

## 4. 添加服务到开机自动运行

`sudo systemctl enable siar.service`

## 5. 验证启动

`ps -ef | grep gunicorn`

- 查看`gunicorn`是否已经启动,有两个进程。

- ## 6. 参考链接

- [SystemdForUpstartUsers](/SystemdForUpstartUsers)

- [systemd.service 中文手册](/systemd/systemd.service.html)

- [Ubuntu 16.04 增加bash脚本为service,开机自启服务脚本配置](/linux/302083.html)

- [用 systemd 配置一个简单的自动重启服务](/a/1190000009590101)

转载请注明:[杨帆](/) » [ubuntu16.04自动系统启动gunicorn教程django](/zhanzhang/1425.html)

## 附录---------------------------------------------------------------

### linux命令介绍:

​ 1 nobup:

```

nohup 命令运行由 [Command]参数和任何相关的 [Arg]参数指定的命令,忽略所有挂断(SIGHUP)信号。在[注销]后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

nohup Command [ Arg ... ] [& ]

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂断的意思( no hang up)

```

nginx的配置文件解释.

```

#运行用户

user nobody;

#启动进程,通常设置成和cpu的数量相等

worker_processes 1;

#全局错误日志及PID文件

#error_log logs/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

#pid logs/nginx.pid;

#工作模式及连接数上限

events {

#epoll是多路复用IO(I/O Multiplexing)中的一种方式,

#仅用于linux2.6以上内核,可以大大提高nginx的性能

use epoll;

#单个后台worker process进程的最大并发链接数

worker_connections 1024;

# 并发总数是 worker_processes 和 worker_connections 的乘积

# 即 max_clients = worker_processes * worker_connections

# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么

# 为什么上面反向代理要除以4,应该说是一个经验值

# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000

# worker_connections 值的设置跟物理内存大小有关

# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数

# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右

# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:

# $ cat /proc/sys/fs/file-max

# 输出 34336

# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内

# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置

# 使得并发总数小于操作系统可以打开的最大文件数目

# 其实质也就是根据主机的物理CPU和内存进行配置

# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。

# ulimit -SHn 65535

}

http {

#设定mime类型,类型由mime.type文件定义

include mime.types;

default_type application/octet-stream;

#设定日志格式

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/access.log main;

#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,

#对于普通应用,必须设为 on,

#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,

#以平衡磁盘与网络I/O处理速度,降低系统的uptime.

sendfile on;

#tcp_nopush on;

#连接超时时间

#keepalive_timeout 0;

keepalive_timeout 65;

tcp_nodelay on;

#开启gzip压缩

gzip on;

gzip_disable "MSIE [1-6].";

#设定请求缓冲

client_header_buffer_size 128k;

large_client_header_buffers 4 128k;

#设定虚拟主机配置

server {

#侦听80端口

listen 80;

#定义使用 访问

server_name ;

#定义服务器的默认网站根目录位置

root html;

#设定本虚拟主机的访问日志

access_log logs/nginx.access.log main;

#默认请求

location / {

#定义首页索引文件的名称

index index.php index.html index.htm;

}

# 定义错误提示页面

error_page 500 502 503 504 /50x.html;

location = /50x.html {

}

#静态文件,nginx自己处理

location ~ ^/(images|javascript|js|css|flash|media|static)/ {

#过期30天,静态文件不怎么更新,过期可以设大一点,

#如果频繁更新,则可以设置得小一点。

expires 30d;

}

#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.

location ~ .php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

#禁止访问 .htxxx 文件

location ~ /.ht {

deny all;

}

}

}

```

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。