[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有更好的吞吐量和更少的错误数

参考

参考

参考

原文地址:https://www.cnblogs.com/iiiiiher/p/8258903.html