zoukankan      html  css  js  c++  java
  • [py]django上线部署-uwsgi+nginx+py3/django1.10

    https://github.com/lannyMa/django-uwsgi-nginx.git

    单机调试启动-确保项目代码没问题

    - 克隆代码进入项目
    git clone https://github.com/lannyMa/django-blog-tutorial.git
    cd django-blog-tutorial
    
    - 创建并进入虚拟环境
    pip install virtualenv 
    virtualenv blogproject_env
    
    - 如果需要mysql-devel
    yum install -y python-devel mysql-devel
    pip install MySQL-python
    
    - 安装项目依赖
    pip install -r requirements.txt
    
    - 同步数据库,创建超级管理员
    python manage.py migrate
    python manage.py createsuperuser
    
    
    - 运行
    python manage.py runserver
    
    - 访问
    http://127.0.0.1:8000
    http://127.0.0.1:8000/admin
    


    代码没问题后,考虑部署到生产

    生产部署-nginx+uwsgi+django10

    部署详情说明

    docker镜像(baseimage+code)代码我放到镜像里了,直接run镜像就可以跑起来直接访问了. 先快速跑一下吧.

    docekr pull lanny/blog-uwsgi-py3-django1.10
    docker run -d -p 8080:80 lanny/blog-uwsgi-py3-django1.10
    
    http://x:8080 来访问,已测过没问题
    

    探究下怎么制作docker镜像

    • 先搞清楚nginx+uwsgi+django物理机上是怎么配合工作的,确保手动一步步启动完成没问题,然后再做镜像
    - nginx启动 /usr/sbin/nginx
    看下nginx.conf配置
        # Django media
        location /media  {
            alias /home/docker/code/app/blog/media;  # your Django project's media files - amend as required
        }
    
        location /static {
            alias /home/docker/code/app/blog/static; # your Django project's static files - amend as required
        }
    
        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  django;
            include     /home/docker/code/uwsgi_params; # the uwsgi_params file you installed
        }
    
    - 原来nginx把归py处理的uwsgi_pass发给了django的uwsgi,uwsgi用uwsgi_params解析
    uwsgi.ini配置文件
    [base]
    chdir = %dapp/
    module=blogproject.wsgi:application
    chmod-socket=666
    
    - uwsgi启动
    /usr/local/bin/uwsgi --ini /home/docker/code/uwsgi.ini  #启动后会监听端口供与nginx通信
    
    - 文末附录有nginx与wsgi通信原理介绍. 
    

    搞清楚了这些后,更近一步着手制作uwsgi+django的docker镜像.

    定制属于自己项目的docker镜像

    参考地址:这里有python2 和python3版本的环境.可以满足日常需求了.
    https://hub.docker.com/r/dockerfiles/django-uwsgi-nginx/
    https://github.com/dockerfiles/django-uwsgi-nginx

    完整的dockerfile和相关配置的关键部分如下

    - dockerfile
    
    FROM ubuntu:16.04
    MAINTAINER Dockerfiles
    
    # Install required packages and remove the apt packages cache when done.
    RUN apt-get update && 
        apt-get upgrade -y && 
        apt-get install -y 
        git 
        python3 
        python3-dev 
        python3-setuptools 
        python3-pip 
        python3-dev 
        libmysqlclient-dev 
        nginx 
        supervisor 
        sqlite3 && 
        pip3 install -U pip setuptools && 
       rm -rf /var/lib/apt/lists/*
    
    # install uwsgi now because it takes a little while
    RUN pip3 install uwsgi
    
    # setup all the configfiles
    RUN echo "daemon off;" >> /etc/nginx/nginx.conf
    COPY nginx-app.conf /etc/nginx/sites-available/default
    COPY supervisor-app.conf /etc/supervisor/conf.d/
    
    # COPY requirements.txt and RUN pip install BEFORE adding the rest of your code, this will cause Docker's caching mechanism
    # to prevent re-installing (all your) dependencies when you made a change a line or two in your app.
    
    COPY app/requirements.txt /home/docker/code/app/
    RUN pip3 install -r /home/docker/code/app/requirements.txt
    
    # add (the rest of) our code
    COPY . /home/docker/code/
    RUN git clone https://github.com/lannyMa/django-blog-tutorial-deploy.git tmp && 
        mv tmp/* /home/docker/code/app/ && 
        rm -rf tmp
    
    # install django, normally you would remove this step because your project would already
    # be installed in the code/app/ directory
    #RUN django-admin.py startproject website /home/docker/code/app/
    
    EXPOSE 80
    CMD ["supervisord", "-n"]
    
    
    - supervisor配置
    [program:app-uwsgi]
    command = /usr/local/bin/uwsgi --ini /home/docker/code/uwsgi.ini
    
    [program:nginx-app]
    command = /usr/sbin/nginx
    
    
    uwsgi.ini配置文件
    [base]
    chdir = %dapp/
    module=blogproject.wsgi:application
    chmod-socket=666
    
    • 修改上面docekrfile的这部分为自己的git项目地址

      即可修改:
    Dockerfile
    
    RUN git clone https://github.com/lannyMa/django-blog-tutorial-deploy.git tmp && 
        mv tmp/* /home/docker/code/app/ && 
        rm -rf tmp
    
    • 修改项目settings.py为
    settings.py
    
    ALLOWED_HOSTS = ['*']
    
    • 修改nginx-app.conf的(django项目)static路径.
    nginx.conf
    
        location /media  {
            alias /home/docker/persistent/media;  # your Django project's media files - amend as required
        }
    
        location /static {
            alias /home/docker/volatile/static; # your Django project's static files - amend as required
        }
    

    等这一切修改完成后,开始构建镜像

    • 构建docker镜像并运行
    docker build -t webapp .
    docker run -d -p 80:80 webapp
    
    - 运行后访问即可
    docker run -d -p 8080:80 webapp
    

    遇到的问题

    界面乱码,css未加载成功


    解决: 修改nginx配置为自己项目static的地址

        location /media  {
            alias /home/docker/persistent/media;  # your Django project's media files - amend as required
        }
    
        location /static {
            alias /home/docker/volatile/static; # your Django project's static files - amend as required
        }
    

    不允许访问,权限拒绝

    解决: 修改settings.py

    ALLOWED_HOSTS = ['写自己服务器的ip即可']
    

    uwsgi启动失败,扫描不到项目

    修改uwsgi.ini

    修改为自己项目的地址,

    module=blogproject.wsgi:application
    

    这里uwsgi调用的是项目的这个

    nginx调用uwsgi.ini


    nginx-app.conf

    # nginx-app.conf
    
    # the upstream component nginx needs to connect to
    upstream django {
        server unix:/home/docker/code/app.sock; # for a file socket
        # server 127.0.0.1:8001; # for a web port socket (we'll use this first)
    }
    
    # configuration of the server
    server {
        # the port your site will be served on, default_server indicates that this server block
        # is the block to use if no blocks match the server_name
        listen      80 default_server;
    
        # the domain name it will serve for
        server_name .example.com; # substitute your machine's IP address or FQDN
        charset     utf-8;
    
        # max upload size
        client_max_body_size 75M;   # adjust to taste
    
        # Django media
        location /media  {
            alias /home/docker/code/app/blog/media;  # your Django project's media files - amend as required
        }
    
        location /static {
            alias /home/docker/code/app/blog/static; # your Django project's static files - amend as required
        }
    
        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  django;
            include     /home/docker/code/uwsgi_params; # the uwsgi_params file you installed
        }
    }
    
    

    uwsgi.ini

    [uwsgi]
    # this config will be loaded if nothing specific is specified
    # load base config from below
    ini = :base
    
    # %d is the dir this configuration file is in
    socket = %dapp.sock
    master = true
    processes = 4
    
    [dev]
    ini = :base
    # socket (uwsgi) is not the same as http, nor http-socket
    socket = :8001
    
    
    [local]
    ini = :base
    http = :8000
    # set the virtual env to use
    home=/Users/you/envs/env
    
    
    [base]
    chdir = %dapp/
    module=blogproject.wsgi:application
    chmod-socket=666
    
    

    附: 什么是wsgi,和django/flask有什么关系

    图解CGI、FastCGI和PHP-FPM关系图解

    the web client <-> the web server(nginx) <-> the socket <-> uwsgi <-> Django
    
    gunicorn vs uwsgi是两种不同的appserver
    
    gunicorn vs uwsgi: http://fatelei.github.io/2015/07/05/Gunicorn-vs-uwsgi/
    uwsgi在高并发下比gunicorn有更好的吞吐量和更少的错误数
    
    

    参考

    参考

    参考

  • 相关阅读:
    深入浅出TCP之listen
    indexing and hashing
    c++四种强制类型转化
    c++实现web服务框架
    MVC、MVP、MVVM概念解析
    常用设计模式
    [React]虚拟DOM
    防抖和节流
    函数柯里化
    apply, bind, call方法剖析
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/8258903.html
Copyright © 2011-2022 走看看