zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    JavaScript 正则表达式
    git常用命令
    用纯css使内容永远居在页面底部
    Oracle中随机抽取N条记录
    表数据回复到某个时候
    oracle同名存储过程被覆盖后如何恢复(转)
    mybatis+spring+mysql
    定位
    关于js的闭包和复制对象
    idea展示runDashboard的窗口
  • 原文地址:https://www.cnblogs.com/ykugb/p/10119988.html
Copyright © 2011-2022 走看看