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 ', '.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;
}
}
}
```
Django项目nginx+gunicorn 部署相关推荐
- 使用 Nginx + Gunicorn 部署 Flask 项目
使用 Nginx + Gunicorn 部署 Flask 项目 Flask Web 项目开发完成后,开发人员只是在开发环境运行,只有本地可以访问到项目.如果要让用户访问到项目,需要将项目部署到生产环境 ...
- vue项目nginx服务器部署详细流程....
vue项目nginx服务器部署 (1)前言 将自己做的vue项目部署到服务器上,这里我采用的工具是Nginx,Nginx是一款轻量级的web服务器.反向代理服务器,由于它的内存占用小,启动快,高并发能 ...
- 在 Linux 上部署 Django 应用,nginx+gunicorn+supervisor
如果是新服务器先要进行基本的配置 部署前应用配置 开发环境与生产环境中的应用一般会有两套不同的配置.比如 DEBUG 选项,数据库配置等. 对于 setting.py 文件, 在生产环境中我们要设置 ...
- Python3 Flask+nginx+Gunicorn部署(上)
前言:一般在本地运行flask项目通常是直接python3 文件名.py,然后打开:http://127.0.0.1:5000 查看代码结果 这次主要是记录flask在python3 环境结合ngin ...
- Django+uwsgi+nginx服务器部署
准备工作 推荐使用anaconda进行python环境的管理,因python环境容易出现各种版本冲突问题 安装anaconda: wget https://repo.anaconda.com/arch ...
- windows环境部署django项目(可部署不同版本的django)
准备事项: 1.django项目的运行环境(python语言等). 2.一个可以正常运行的django项目. 3.windows环境的IIS安装好. 4.关闭调试模式,修改settings.py文件. ...
- Django项目使用gunicorn
一般启动命令:gunicorn djangoProjectName.wsgi:application(djangoAppName: 为Django对应的项目名称) 例如:gunicorn django ...
- Python3.7.6 Django项目上传部署(一)
1.Python环境检查,Linux系统中,Python默认是2.7的,需要升级环境. 下载安装升级: wget https://www.python.org/ftp/python/3.7.6/Pyt ...
- 【Flask】Nginx / Gunicorn入门:部署你的Flask项目
什么是Nginx? 参考:Nginx入门 什么是反向代理呢? 我们很多人应该都用过淘宝,要知道每天同时连接到淘宝网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个 ...
- docker部署django项目、mysql主从搭建、django实现读写分离
目录 docker部署django项目 1.1 基于python基础镜像 将本地django项目打包并发到远程服务器上 将服务器上的.zip django项目解压 部署的具体流程 1.2 基于dock ...
最新文章
- DELPHI 中 Window 消息大全使用详解
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
- 锁相环环路滤波器计算公式_锁相环计算方法
- 如何阅读《深入理解计算机系统》?(文末送书)
- dubbo-admin构建报错
- axios的content-type是自动设置的吗?
- linux unzip命令不存在_15个常用基础命令Linux(很多人不知道!)
- 2022零售行业消费趋势新主张
- python制作饼状图
- magicmatch java_Java-webmagic爬虫
- ubuntu 18.04 ROS melodic 尝试 ROS CANOPEN 控制 AGV
- Centos7 设置静态IP后重启网络服务出错
- python3.6安装pyspider
- 在Netty中使用Apache common fileupload
- 小程序window对象的探索
- excel表格的函数公式大全
- zipOutputStream压缩后用RAR解压出现“不可预料的压缩文件末端”错误
- matlab求解微分方程ode23
- 如何在 3dMax 中制作游戏中的战斧模型?
- python练习生|这是你熟悉的第一行代码吗?(附python安装教程(win))
热门文章
- context deadline exceeded
- 股票学习-量柱和k线-第一天
- 基本表改变视图不改变为什么_为什么说10万本金以下穷人玩股票一般都会赔?不改变穷人思维,还不如退出股市...
- 2022IEOC全国赛专业组获奖及晋级成绩公布 全球赛期待继续辉煌
- 云计算淡定从容的大局观
- Android开发之隐示意图跳转
- C# 输入一个正整数N,判断N是奇数还是偶数,输出1~N的奇数和或是偶数和,三种不同方法分别实现
- CASE WHEN THEN 判断
- 比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle
- linux格式化u盘为ntfs格式,Linux上格式化U盘为NTFS格式