Linux生产环境下部署Django+Nginx+uwsgi

版权声明: https://blog.csdn.net/Scirhh/article/details/82467748

    本文是在上一篇 Linux操作系统下部署Jenkins环境,数据迁移(备机部署)以及主从节点的配置 ”基础上进行延伸,Jenkins+Django+Nginx+uWSGI才是一套解决方案。

    之所采用Django+Nginx+uwsgi的解决方案,是由于python manage.py runserver 0:8081形式启动Django,只适用于环境测试。当退出终端,甚至退出执行python manage.py runserver,就会发现无法对Django进行访问。为了解决这个问题,在企业中都会使用Django+Nginx+uwsgi 的解决方案。


目录

   环境准备

    环境部署

         Python3.6部署

          Mysql部署

          Django部署

          Nginx服务部署


   环境准备

Num Software  Version
1 Python 3.6
2 Django 1.11.9
3 mysqlclient 1.3.13
4 Mysql 5.7
5 Uwsgi 2.0.17

    环境部署

    说明:本文部署的服务绝大多数,均采用源码编译安装的方式进行。且所使用软件版本,均是编者在自身生产环境下采用的,软件版本视个人情况而言。


         Python3.6部署

[-> ~# opt] wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
[-> ~# opt] yum install gcc make openssl-devel pcre-devel zlib-devel sqlite-devel python-devel -y
[-> ~# opt] cd Python-3.6.0
[-> ~# Python-3.6.0] ./configure --prefix=/usr/local make && make install     # 如果没有安装gcc make 等包,在编译安装时会出错

     如果编译安装后没有pip的用户,可以自行到官网进行下载 https://pypi.org/project/pip/。但其实一般来说,源码编译安装后都会有pip,只是在使用pip的时候,系统默认调用的是 "/usr/bin" 路径下。而我们编译安装的是在 "/usr/local/bin/"路径下。所以,我们可以做个链接到"/usr/bin" (ln -s /usr/local/bin/pip /usr/bin/pip)来解决。

      如果实在是没有的用户,在下载后,解压后进入到pip文件内使用如下命令进行安装:

[-> ~# opt] tar -xvf pip-18.0.tar
[-> ~# opt] cd pip-18.0
[-> ~# pip-18.0] python setup.py install

          Mysql部署

[-> ~# opt] wget  http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
[-> ~# opt] yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
[-> ~# opt] systemctl start mysqld
[-> ~# opt] systemctl enable mysqld
[-> ~# opt] grep password /var/log/mysqld.log      # 查看数据库初始化密码
[-> ~# opt] ss -antulp | grep :3306         # 查看数据库是否已启动

       Mysql 数据库命令行的基本操作可以网上自行学习,这里就不过多阐述。


          Django部署

       Django的部署,在编者以往的文章 “ 使用Python、Django、Bootstrap编写Web页面,以及利用ansible-cmdb、ansible等模块,在web界面获取批量服务器配置信息,以及实现批量管理服务器 ”有较为详细的安装部署步骤,不懂的读者可以前去查阅。

       在虚拟环境下安装所需要的模块:

(dj_env)[-> ~# dj_env] pip install django==1.11.9
(dj_env)[-> ~# dj_env] pip install mysqlclient==1.3.13
(dj_env)[-> ~# dj_env] pip install uwsgi==2.0.17
(dj_env)[-> ~# dj_env] pip list         # 查看列表是否安装成功,成功如下图

Package     Version
----------- -------
Django      1.11.9 
mysqlclient 1.3.13 
pip         18.0   
pytz        2018.5 
setuptools  28.8.0 
uWSGI       2.0.17

     新增uwsgi文件:建议创建在django app 同级目录下

(dj_env)[-> ~# dj_app] vim uwsgi.ini
    # 内容如下:
    [uwsgi]
    chdir = /opt/dj_app/dj_app     # 指定工作目录
    socket = 127.0.0.1:8081        # 通过套接字的方式进行访问,端口可因个人实际情况进行修改,                
                                   # 如果不想直接写入,可以生成stock文件,然后进行制定
    #socket = ./uwsgi.sock         # 如果这里使用uwsgi.sock文件,则在nginx.conf文件内的uwsgi_pass文件就必须是soc文件的绝对路径
    module=oms.wsgi:application
    chmod-socket = 664
    static-map=/static=./static    # 静态文件路径
    master = true                  # 主进程
    vacuum = true                  # 重启或退出时清理文件
    workers = 2                    # 子进程数
    uid = scon                     # 指定启动的用户
    gid = scon
    pidfile = ./uwsgi8081.pid      # 创建pid进程文件,主要用于启动、停止该进程
    daemonize = ./uwsgi8081.log    # 启动的日志文件


# 在使用uwsgi --ini uwsgi.ini命令前,建议先使用命令pkill uwsgi,然后使用lsof -i 8081,看下有没有服务占用此端口。如果有则kill掉

(dj_env)[-> ~# dj_app] uwsgi --ini uwsgi.ini    # 类似初始化,生成相关文件,从ini文件中获取配置

          Nginx服务部署

[-> ~# opt] wget http://nginx.org/download/nginx-1.11.2.tar.gz
[-> ~# opt] tar -xvf nginx-1.11.2.tar.gz
[-> ~# opt] cd nginx-1.11.2
[-> ~# nginx-1.11.2] ./configure --prefix=/usr/local/nginx    
[-> ~# nginx-1.11.2] make && make install

            启动Nginx服务

[-> ~# opt] ln -s /usr/local/nginx/sbin/nginx   /sbin/nginx
[-> ~# opt] nginx           # 启动服务
[-> ~# opt] lsof -i 80      # 查看哪个服务占用80端口,然后kill掉

            修改Nginx配置文件:

[-> ~# opt] vim //usr/local/nginx/conf/nginx.conf
    # 修改为如下:80端口映射多端口
        server {
            listen 80;
            server_name localhost;

        location  / {
           # proxy_pass 127.0.0.1:8081;
            proxy_set_header Host             $host;
            proxy_set_header X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            #uwsgi_pass  unix:uwsgi.sock的绝对路径;
            uwsgi_pass 129.0.0.1:8081;
            include uwsgi_params;
           }
        }
                        ... ...
        server {
            listen 80;
            server_name www.a.com;

        location  / {
            proxy_pass 127.0.0.1:8080;
            proxy_set_header Host             $host;
            proxy_set_header X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
           }
        }
        
[-> ~# opt] ngins -t             # 如果出现ok,说明配置文件修改无误,如果有报错,则需要解决
[-> ~# opt] nginx -s reload      # 重新加载nginx配置文件

        到这里,Django+Nginx+uwsgi 就已经部署完成了,此时我们使用如下命令:

(dj_env)[-> ~# dj_app] uwsgi --ini uwsgi.ini
(dj_env)[-> ~# dj_app] ss -antulp      # 查看8081端口是否已经由uwsgi启动,如果是则成功。

        最后,访问 “ http://127.0.0.1:8081 ”,就可以看到Django页面的 “  It   Work”。

         本文旨在提供参考,如有错误,欢迎大家指正。帮助编者不断的改进!

猜你喜欢

转载自blog.csdn.net/Scirhh/article/details/82467748