nginx+gunicorn

在nginx+uwsgi的部署中发现部署的过程,会有很多时候出现502的错误,或者直接程序死了,到现在,学习一个nginx+gunicorn的部署,

0.创建用户更新系统

我们拿到新的服务器对的时候,应该先更新下服务器:

  1. $ sudo yum update

其次我们应该创建一个用户,用来部署,在Centos下创建用户:

  1. $ adduser jummy #这里是输入用户名,jummy可以换成自己喜欢的用户名
  2. $ passwd jummy # 这里是输入密码
  3. ---------授权--------------
  4. $ chmod -v u+w /etc/sudoers
  5. $ vim /etc/sudoers

我们在这个sudoers的文件下我们找到root那行:

  1. # /etc/sudoers
  2. ···
  3. root ALL=(ALL) ALL
  4. jummy ALL=(ALL) ALL # 这是新添加的用户需要自己写

保存退出后,应该收回这个权限chmod -v u-w /etc/sudoers

  1. $ su jummy
  2. $ sudo cat /etc/sudoers
  3. $ 输入密码,这里照输入,因为密码看不见的,所以你看到是空白,但其实输入对确认就可以了

这样我们就新创建用户完毕,可以去配置环境了

1.环境

我是在centos7下的,装了python3.6,和虚拟环境,虚拟环境的作用想必学py的人都知道他的用处,如果不会可以在 Centos下安装pyenv和virtualenvwrapper

  1. $ mkdir workspace
  2. $ pip instlall virtualenv
  3. $ virtualenv typeidea
  4. $ source typeidea/bin/activate

我们先建一个文件夹来装我们的虚拟环境,然后在创建一个名为typeidea的虚拟环境(你的名字可以跟我不一样),然后我们进入到我们的环境当中

2.Git项目到服务器上

把我们写的代码放到服务器,你们可以选择用FileZilla传输过去,也可以用Git,这里为了装B一下,我还是用Git去传输,如果对Git不熟悉可以看Git的使用操作

  1. $ cd
  2. $ mkdir typeidea
  3. $ cd typeidea
  4. $ git clone 你的仓库地址
3.下载项目依赖包

一般我们的项目在上传到服务器时,会打包一份requirements.txt的文件,这是用于加载我们在开发阶段所用到包,以及版本,为了避免在部署的时候版本不一样,而导致的问题,我们通常会先生成个txt的文件,所以在你的开发环境中,进入虚拟环境,在你的项目根目录执行如下:

  1. $ pip freeze > requirements.txt

生成完成后,可以去看我写的Git操作,把项目上传到GitHub上,或者自己搭建的Git服务器,在切到服务器中Git下来,进入到服务器的虚拟环境,去到requirements.txt的路径下

  1. $ pip install -r requirements.txt

系统会自动帮你安装依赖

4.下载mysql,redis(这里看自己需求而选择)

这两个是我们用的最多的插件,mysql的安装在我的简书上会有一个详细的安装过程,但那是5.6的如果是其他的,请自己去问问搜索引擎,这里不详细介绍,mysql5.6安装,下面是redis的安装如下

  1. $ wget http://download.redis.io/releases/redis-4.0.9.tar.gz
  2. $ tar xzf redis-4.0.9.tar.gz
  3. $ cd redis-4.0.9
  4. $ make

如果其他配置需要自己去设置先,暂时我的博客是用了这两个插件

5.启动项目,收集静态,配置settings

这里我们可以先直接启动下项目python manage.py runserver,看下是否能正常启动还是说少了安装包什么的,如果少了,可以通过pip去安装一波,启动成功后Ctrl+c结束掉。在settings.py中我们先看看有没有设置静态文件收集在哪里的语句,如果没,就加上

  1. $ vim settings.py
  2. ALLOWED_HOSTS = ['*'] # 可以配置为你的域名或者公网IP,写*是匹配全部都可以
  3. ···
  4. THEME = 'themes/default'
  5. STATIC_URL = '/static/'
  6. STATIC_ROOT = '../static_files/'
  7. ···

只要加入STATIC_ROOT这个就好,后面的路径请自己选择,我这里是放在了上一层目录当中,因为我的项目路径是,一个typeidea,里面才是django的项目,我们收集静态文件

  1. $ cd typeidea
  2. $ python manage.py collectstatic

到这里我们就能发现我们的上一层目录已经多了静态资源的文件夹

6.启动gunicorn
  1. # 在虚拟环境下
  2. $ pip install gunicorn

根据gunicorn的文档我们试下用gunicorn启动下项目,这里的typeidea换成自己的项目名。

  1. $ 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换成自己的项目名。

  1. $ nohup gunicorn typeidea.wsgi:application -w 4 -b 0.0.0.0:8000 &
7.nginx的配置

nginx的 功能可以说很强大,能做负载均衡,端口的分发,对静态资源的处理等等,我们先来一波下载nginx

  1. $ sudo yum install nginx

下载好后,我们直接运行命令启动我们的nginx

  1. $ sudo service nginx start

这样就能看到我们熟悉的欢迎页面了,我们先来看看nginx的配置在去写nginx

  1. $ cd /etc/nginx
  2. $ sudo cat nginx.conf

这个时候我们就能看到在配置中有这样的一句话,

  1. include /etc/nginx/conf.d/*.conf;

这个意思是他启动的时候会去读取conf.d下的配置文件,也就是我们可以在这个 /etc/nginx/con.d目录下去写配置文件,操作如下

  1. $ cd /etc/nginx/conf.d
  2. $ sudo touch nginx.conf
  3. $ sudo vim nginx.conf

配置文件的内容如下:

  1. # /etc/nginx/conf.d/nginx.conf
  2. server {
  3. listen 80;
  4. root /home/jummy/workspace/typeidea-env/; #配置虚拟环境的目录
  5. access_log /home/jummy/workspace/typeidea/log/access_log; #配置这个log文件夹
  6. error_log /home/jummy/workspace/typeidea/log/error_log; #配置这个log文件夹
  7. server_name www.jummy.top; # 配置域名
  8. #处理静态文件 /favicon.ico:
  9. location /favicon.ico {
  10. alias /home/jummy/typeidea/static_files/favicon.ico; # 如果没,不用配置
  11. }
  12. #处理django的静态文件
  13. location /static/ {
  14. alias /home/jummy/typeidea/static_files/; # 收集静态资源的路径
  15. }
  16. #处理请求转发8000接口 如果你的gunicorn是其他端口,请自己改
  17. location / {
  18. proxy_pass http://127.0.0.1:8000;
  19. proxy_set_header X-Real-IP $remote_addr;
  20. proxy_set_header Host $host;
  21. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  22. }
  23. }

这样我们的nginx配置文件就能写完了,但是如果你重启的话,会发现一个问题,那就是权限,你会发现你启动的文件,于你的配置文件权限不一样,这会导致你无法启动,或者是其他问题,我们返回之前的/etc/nginx的目录之下,把下面的用户名改为自己的用户名字,就可以了:

  1. # /etc/nginx/nginx.conf
  2. ···
  3. user jummy
  4. ···

当然写完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