Center OS Django部署

Center OS 部署 Django 程序,使用 Nginx + uWsgi + Supervisor

Python3 环境安装

  1. 安装可能使用到的依赖
    yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel
  2. 从Python官网找到需要的Python版本的下载路径,使用wget下载到服务器
    这里以Python3.6.7为例:https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
    下载到服务器命令:wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
  3. 解压tgz压缩包
    tar -zxvf Python-3.6.7.tgz
    解压完可以在当前目录下看到Python-3.6.7的目录
  4. 把Python移到 /usr/local
    mv Python-3.6.7 /usr/local
  5. 进入Python-3.6.7目录
    cd /usr/local/Python-3.6.7
  6. 配置
    ./configure
  7. 编译
    make
  8. 安装
    make install
  9. 创建软链接(以便在全局调用)
    ln -s /usr/local/bin/python3.6 /usr/bin/python3
  10. 查看是否安装成功
    python3 -V

将项目传到到服务器

这里我们使用Git来操作,我们把项目传到如:Github或Coding等代码仓库,然后使用Git克隆到服务器。这样每次项目更新了只要将代码上传到仓库,在到服务器将代码拉下来就可以实现代码更新了

  1. 项目配置
    记得在项目的settings.py中添加以下配置
    1
    2
    3
    4
    5
    DEBUG = False
    ALLOWED_HOSTS = ['你的公网ip(不带端口号)'] # 如果不配置服务器的IP地址将导致外网无法访问,或者使用['*']代表授权全部

    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  2. 安装Git
    yum install git
  3. 克隆项目到服务器
    git clone http://xxxxxx.com,将http://xxxxxx.com换成自己仓库的地址
  4. 拉取更新的代码
    git pull
  5. 更多
    更多的Git命令可以查看我另一篇文章:https://smileorigin.site/2017/10/18/Git/Git/

使用Virtualenv来创建虚拟环境

为每一个Django项目都创建一个虚拟环境可以使每个项目的依赖包都互不影响,也不会污染全局环境,其他使用和信息可以查看我的另一篇文章–https://smileorigin.site/2018/08/06/Python/Virtualenv/

  1. 更新pip
    pip3 install --upgrade pip
  2. 安装Virtualenv
    pip3 install virtualenv
  3. 进入项目所在文件夹
    假设我们项目文件夹在当前目录且名称为server
    cd server
  4. 创建虚拟环境
    在当前文件夹下创建一个名为venv的虚拟环境
    virtualenv venv
  5. 激活虚拟环境
    source venv/bin/activate
    可以看到在root之前多了个(venv),说明激活虚拟环境成功了
  6. 使用requirements.txt文件安装依赖包
    如果有使用pip freeze >requirements.txt在本地项目导出项目的所有依赖包,则可以通过该命令进行快速安装依赖包,没有的话就手动使用pip安装项目需要的依赖包
    pip install -r requirements.txt

安装配置uWsgi

  1. 安装
    pip install uwsgi
  2. 测试uwsgi
    vim test.py
    填写以下内容
    1
    2
    3
    def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'Hello world'] # Python3
    保存后,执行指令进行测试:uwsgi --http 127.0.0.1:8000 --wsgi-file test.py
    如果执行成功,则会有以下类似信息:

    打开另一个命令行窗口,输入以下命令进行测试:curl 127.0.0.1:8000
    如果提示以下信息则表示测试页面运行成功:
    可以看到截图有显示:Hello world
  3. 新建uwsgi配置文件
    vim uwsgi.ini
    可以按照以下模板进行填写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    [uwsgi]
    # 我的项目目录
    chdir = /root/server
    # 指定项目的application
    module = imageAnalyze.wsgi
    # 进程个数
    workers = 5
    #pid文件保存路径
    pidfile = /root/server/uwsgi/uwsgi.pid
    # 指定IP端口
    http = 127.0.0.1:8000
    # 指定静态文件
    static-map = /static=/root/server/static
    # 启动uwsgi的用户名和用户组
    uid = root
    gid = root
    # 启用主进程
    master = true
    # 自动移除unix Socket和pid文件当服务停止的时候
    vacuum = true
    # 序列化接受的内容,如果可能的话
    thunder-lock = true
    # 启用线程
    enable-threads = true
    # 设置自中断时间
    harakiri = 30
    # 设置缓冲
    post-buffering = 4096
    # 设置日志目录
    daemonize = /root/server/uwsgi/uwsgi.log
    # 指定sock的文件路径
    socket = /root/server/uwsgi/uwsgi.sock
  4. 新建配置文件中的指定文件夹
    如果不创建可能导致以配置文件启动uwsgi报文件夹不存在的错误
    mkdir uwsgi
  5. 创建static文件夹
    mkdir static
  6. 收集项目静态文件
    python manage.py collectstatic

    收集成功会提示收集的文件数
  7. 以配置文件的形式启动uwsgi
    uwsgi --ini uwsgi.ini
    如果启动成功,则有以下类似提示

    使用netstat -tnlp命令可以查看在有哪些端口是运行的,可以看到uwsgi运行在127.0.0.1:8000
  8. 关闭
    uwsgi --stop uwsgi/uwsgi.pid

安装配置Nginx

记得在配置Nginx的时候如果使用的是阿里云服务器,要让外部使用的端口要先在阿里云服务器的安全组中打开,否则会不能访问

  1. 查找要安装的Nginx的包链接
    http://nginx.org/packages/centos/7/x86_64/RPMS/
  2. 安装
    rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.14.1-1.el7_4.ngx.x86_64.rpm
  3. 配置Django项目的Nginx配置文件
    cd /etc/nginx/conf.d
    vim server.conf,创建你项目的Nginx的配置文件,把server换成任意名字(/etc/nginx/nginx.conf文件的最后一行是include /etc/nginx/conf.d/*.conf;会加载/etc/nginx/conf.d文件夹下的所有后缀为.conf的配置文件,所以只要在这个目录下创建后缀为.conf的配置文件并配置相关内容,Nginx就会自动帮我们加载了,不需要额外的处理)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    server{
    listen 80; # 监听的端口
    server_name cookbook.aicircle.site;
    server_name www.cookbook.aicircle.site # 使外部可通过www.cookbook.aicircle.site进行访问
    #当请求这些server name的时候,nginx才会做反向代理,0.0.0.0是指全部
    location / {
    proxy_pass http://127.0.0.1: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;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    # location 顾名思义,定位,就是当访问 / 的时候,nginx会将请求转给本地的8080>端口,而后面的设置都是>一些基本的配置,可以直接用
    location /static {
    alias /root/server/static;
    }
    # 这个就是配置静态文件的地方,要用绝对地址,对应最开始的目录形式,假设project就在/home下面,那么这>样配置就可以的了,还有个前提是,你在开发的时候,采取了django的建议,每个app的静态文件都用多了一层app_name的文件夹来包住。
    }
  4. 查看Nginx状态
    systemctl status nginx,如果Nginx是启动的则会有以下类似提示:
  5. 测试Nginx配置文件是否有误
    nginx -t,如果有以下类似提示,则配置文件没错
  6. 启动Nginx
    systemctl start nginx
  7. 测试是否启动成功
    curl http://127.0.0.1:80,如果Nginx启动成功,则会显示以下类似内容
  8. 设置开机自启
    systemctl enable nginx,如果设置成功则会有类似提示信息
  9. 关闭Nginx
    systemctl stop nginx
  10. 重启Nginx
    systemctl restart nginx

使用Supervisor来管理进程

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去,就可以实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息,可以选择是否重新启动程序或报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

  1. 安装
    安装我们使用Center OS自带的Python2来安装,Supervisor不支持Python3,打开另一个命令窗口使用以下命令安装
    pip2 install supervisor
  2. 设置配置文件
    vim supervisord.conf,在任意你想要的位置创建配置文件,根据说明将以下参数改为自己的配置,保存
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [program:server]
    command=/root/server/venv/bin/uwsgi --ini /root/server/uwsgi.ini
    directory=/root/server
    startsecs=1
    stopwaitsecs=1
    autostart=true
    autorestart=true
    [supervisord]
    [supervisorctl]
    • program:server:指定程序名称,server为自定义程序名称
    • command:启动程序的命令,这里是调用虚拟环境内的uwsgi根据配置文件/root/server/uwsgi.ini启动Django程序
    • directory:项目所在的文件夹
    • startsecs:启动延迟
    • stopwaitsecs:关闭延迟
    • autostart:是否自动启动
    • autorestart:是否自动重启
  3. 启动Supervisor
    supervisord是服务端,supervisorctl是客户端
    supervisord -c supervisord.conf,如果surpervisord.conf不在当前文件夹则需要其绝对路径(如:/etc/xx/supervisord.conf
  4. 重启supervisor
    service supervisord restart
  5. 启动进程
    supervisorctl -c supervisord.conf start server
  6. 重启进程
    supervisorctl -c supervisord.conf restart server
  7. 关闭进程
    supervisorctl -c supervisord.conf stop server
  8. 启动所有进程
    supervisorctl start all
  9. 关闭所有进程
    supervisorctl stop all
  10. 查看所有进程的状态
    supervisorctl status
  11. 查看Supervisor的进程信息
    ps -ef | grep supervisord

错误解决方案

  • 如果以上都配置好了,发现进入网站静态文件无法正常加载,请确认你的项目是不是在/root文件夹下,如果是的话则在修改root目录的权限
    chmod -R 755 root
    修改完后重启Nginx服务器重新访问网站即可
  • 无法访问服务器(博主这边用的是阿里云服务器,默认防火墙是关闭的)
    1. 检查服务器防火墙是否将用到的端口都设为白名单
    2. 如果是阿里云服务器,检查安全组是否添加用到的端口为入方向白名单

参考文章

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×