Django项目nginx+gunicorn 部署

本文详细介绍了如何使用Django、Nginx和Gunicorn在服务器上部署Web应用,包括创建新用户、安装必要软件、配置静态文件、使用Git上传代码、创建虚拟环境、安装依赖、收集静态文件、生成数据库、创建超级用户、配置Nginx和Gunicorn,以及实现服务自启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 ', '.zmrenwu.com']
```

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

项目还会依赖一些第三方 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 https://github.com/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 中文手册](http://www.jinbuguo.com/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](https://wiki.ubuntu.com/SystemdForUpstartUsers)
  - [systemd.service 中文手册](http://www.jinbuguo.com/systemd/systemd.service.html)
  - [Ubuntu 16.04 增加bash脚本为service,开机自启服务脚本配置](http://www.zhimengzhe.com/linux/302083.html)
  - [用 systemd 配置一个简单的自动重启服务](https://segmentfault.com/a/1190000009590101)

转载请注明:[杨帆](http://www.yangfan.cc/) » [ubuntu16.04自动系统启动gunicorn教程django](http://www.yangfan.cc/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;
        #定义使用 www.nginx.cn访问
        server_name  www.nginx.cn;

        #定义服务器的默认网站根目录位置
        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;
        }

    }
}
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值