nginx+gunicorn
在nginx+uwsgi的部署中发现部署的过程,会有很多时候出现502的错误,或者直接程序死了,到现在,学习一个nginx+gunicorn的部署,
0.创建用户更新系统
我们拿到新的服务器对的时候,应该先更新下服务器:
$ sudo yum update
其次我们应该创建一个用户,用来部署,在Centos下创建用户:
$ adduser jummy #这里是输入用户名,jummy可以换成自己喜欢的用户名
$ passwd jummy # 这里是输入密码
---------授权--------------
$ chmod -v u+w /etc/sudoers
$ vim /etc/sudoers
我们在这个sudoers
的文件下我们找到root那行:
# /etc/sudoers
···
root ALL=(ALL) ALL
jummy ALL=(ALL) ALL # 这是新添加的用户需要自己写
保存退出后,应该收回这个权限chmod -v u-w /etc/sudoers
$ su jummy
$ sudo cat /etc/sudoers
$ 输入密码,这里照输入,因为密码看不见的,所以你看到是空白,但其实输入对确认就可以了
这样我们就新创建用户完毕,可以去配置环境了
1.环境
我是在centos7下的,装了python3.6,和虚拟环境,虚拟环境的作用想必学py的人都知道他的用处,如果不会可以在 Centos下安装pyenv和virtualenvwrapper
$ mkdir workspace
$ pip instlall virtualenv
$ virtualenv typeidea
$ source typeidea/bin/activate
我们先建一个文件夹来装我们的虚拟环境,然后在创建一个名为typeidea
的虚拟环境(你的名字可以跟我不一样),然后我们进入到我们的环境当中
2.Git项目到服务器上
把我们写的代码放到服务器,你们可以选择用FileZilla传输过去,也可以用Git,这里为了装B一下,我还是用Git
去传输,如果对Git
不熟悉可以看Git的使用操作
$ cd
$ mkdir typeidea
$ cd typeidea
$ git clone 你的仓库地址
3.下载项目依赖包
一般我们的项目在上传到服务器时,会打包一份requirements.txt
的文件,这是用于加载我们在开发阶段所用到包,以及版本,为了避免在部署的时候版本不一样,而导致的问题,我们通常会先生成个txt
的文件,所以在你的开发环境中,进入虚拟环境,在你的项目根目录执行如下:
$ pip freeze > requirements.txt
生成完成后,可以去看我写的Git
操作,把项目上传到GitHub上,或者自己搭建的Git
服务器,在切到服务器中Git
下来,进入到服务器的虚拟环境,去到requirements.txt
的路径下
$ pip install -r requirements.txt
系统会自动帮你安装依赖
4.下载mysql,redis(这里看自己需求而选择)
这两个是我们用的最多的插件,mysql
的安装在我的简书上会有一个详细的安装过程,但那是5.6的如果是其他的,请自己去问问搜索引擎,这里不详细介绍,mysql5.6安装,下面是redis的安装如下
$ wget http://download.redis.io/releases/redis-4.0.9.tar.gz
$ tar xzf redis-4.0.9.tar.gz
$ cd redis-4.0.9
$ make
如果其他配置需要自己去设置先,暂时我的博客是用了这两个插件
5.启动项目,收集静态,配置settings
这里我们可以先直接启动下项目python manage.py runserver
,看下是否能正常启动还是说少了安装包什么的,如果少了,可以通过pip
去安装一波,启动成功后Ctrl+c
结束掉。在settings.py
中我们先看看有没有设置静态文件收集在哪里的语句,如果没,就加上
$ vim settings.py
ALLOWED_HOSTS = ['*'] # 可以配置为你的域名或者公网IP,写*是匹配全部都可以
···
THEME = 'themes/default'
STATIC_URL = '/static/'
STATIC_ROOT = '../static_files/'
···
只要加入STATIC_ROOT
这个就好,后面的路径请自己选择,我这里是放在了上一层目录当中,因为我的项目路径是,一个typeidea
,里面才是django
的项目,我们收集静态文件
$ cd typeidea
$ python manage.py collectstatic
到这里我们就能发现我们的上一层目录已经多了静态资源的文件夹
6.启动gunicorn
# 在虚拟环境下
$ pip install gunicorn
根据gunicorn
的文档我们试下用gunicorn
启动下项目,这里的typeidea
换成自己的项目名。
$ gunicorn typeidea.wsgi:application -w 4 -b 0.0.0.0:8000
这里简单说明一下,-w
的参数是指启动多少个线程,我这里可以启动4个线程,这个根据自己的服务器大小,已经项目需求去启动数目,一般4个线程够用了。
-b
的参数是指明了启动的端口,默认是127.0.0.1:8000
,这里我是指明了监听全部端口,这个可以跟启动django
的项目端口一样,这样我们就能发现我们的线程启动了,也不会有错误,我们把这个gunicorn扔到后台去跑,或者进阶去用supervisord.conf
去管理,这里的typeidea
换成自己的项目名。
$ nohup gunicorn typeidea.wsgi:application -w 4 -b 0.0.0.0:8000 &
7.nginx的配置
nginx
的 功能可以说很强大,能做负载均衡,端口的分发,对静态资源的处理等等,我们先来一波下载nginx
$ sudo yum install nginx
下载好后,我们直接运行命令启动我们的nginx
$ sudo service nginx start
这样就能看到我们熟悉的欢迎页面了,我们先来看看nginx的配置在去写nginx
$ cd /etc/nginx
$ sudo cat nginx.conf
这个时候我们就能看到在配置中有这样的一句话,
include /etc/nginx/conf.d/*.conf;
这个意思是他启动的时候会去读取conf.d
下的配置文件,也就是我们可以在这个 /etc/nginx/con.d
目录下去写配置文件,操作如下
$ cd /etc/nginx/conf.d
$ sudo touch nginx.conf
$ sudo vim nginx.conf
配置文件的内容如下:
# /etc/nginx/conf.d/nginx.conf
server {
listen 80;
root /home/jummy/workspace/typeidea-env/; #配置虚拟环境的目录
access_log /home/jummy/workspace/typeidea/log/access_log; #配置这个log文件夹
error_log /home/jummy/workspace/typeidea/log/error_log; #配置这个log文件夹
server_name www.jummy.top; # 配置域名
#处理静态文件 /favicon.ico:
location /favicon.ico {
alias /home/jummy/typeidea/static_files/favicon.ico; # 如果没,不用配置
}
#处理django的静态文件
location /static/ {
alias /home/jummy/typeidea/static_files/; # 收集静态资源的路径
}
#处理请求转发8000接口 如果你的gunicorn是其他端口,请自己改
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这样我们的nginx配置文件就能写完了,但是如果你重启的话,会发现一个问题,那就是权限,你会发现你启动的文件,于你的配置文件权限不一样,这会导致你无法启动,或者是其他问题,我们返回之前的/etc/nginx
的目录之下,把下面的用户名改为自己的用户名字,就可以了:
# /etc/nginx/nginx.conf
···
user jummy
···
当然写完nginx
的时候我们可以进入到自己写的配置路径下面,执行nginx -t
看下所运行的状态,或者第几行发生到错误。然后我们就可以启动nginx,在浏览器输入自己的IP或者域名就成功
ps:1.如果发现启动还是无法访问,首先检查一下防火墙,防火墙要开80端口,不会开可以看这编Linux上防火墙的设置
2.去自己的服务器厂家的控制台,查看自己是否放通了安全组,一般要放通80,如果要调试可以顺便把8000端口也放通,当然取决于自己实际需求
3.检查自己的nginx
的静态路径,反响代理的端口和IP,以及文件的权限问题
4.以上机器是在阿里云,腾讯云的Centos7.2的服务器上测试,均部署成功,如有问题,请留言,谢谢大佬们
8.问题
如果有问题,可以在下方留言,或者发邮件到a929440925@gmail.com,我会把我所知的帮你们解答,如有不好的地方,也可以留言说说,谢谢大家,转载请说明出处,谢谢
9.更新了Supervisrcrd管理
如果想要用Supervisrcrd
去管理,可以看这编文章Supervisrcrd