Nginx + uWSGI 部署Django 项目,并实现负载均衡

一.uWSGI服务器

uWSGI是一个 Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的做用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
  • WSGI是一种通讯协议。
  • uwsgi是一种线路协议而不是通讯协议,在此经常使用于在uWSGI服务器与其余网络服务器的数据通讯。
  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
 
Nginx: 和uWSGI同样也是一个Web服务器, Nginx在处理静态内容方面具备强大的能力(Nginx也能够实现负载均衡),uWSGI负责Python这样的动态内容,两者配合共同提供Web服务以实现提升效率和负载均衡等目的, 请求和响应的流程以下:
  Request > Nginx > uWSGI > Django > uWSGI > Nginx > Response
请求先交由Nginx,若是是静态内容就本身处理了,若是是动态内容就交给uWSGI服务器,uWSGI服务器处理整个Django项目的Python代码,响应请求,原路返回,Nginx、uWSGI和Django能够独立部署,而后整合。
 

二.Django 项目代码部署

一个django项目最基本的目录结构以下 /root/blog/javascript

blog
├── manage.py
├── blog
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── apps
├── static
└── templates

apps 目录为应用目录,若是须要将该目录下的应用在配置文件中进行有效的注册,以及在项目下的urls.py中路由到应用须要在settings.py中进行路径的配置php

使用django自带的服务器进行项目的测试 ,进入manage.py文件所在目录下:css

python ./manage.py runserver 127.0.0.1:8080

若是项目的运行还须要启动其余服务,也先将其进行启动, 如celery, redis, mysql, kafka,rabbitmq等项目中使用到的各类服务器html

而后请求项目中的某个API,测试部署是否成功java

二. 部署uWSGI服务器

1.在虚拟环境下安装uWSGI服务器

pip install uwsgi。 

2.建立保存uWSGI服务器配置文件的目录和文件

/root/blog/uWSGI_setting_file/uwsgi.ini
在 uwsgi.ini 文件内 定义如下内容:
[uwsgi] 
#使用nginx调度度服务器链接该uwsgi服务器时使用如下项 socket=127.0.0.1:8000
#直接使用uwsgi服务器作web服务器时使用如下项,服务器的ip和端口 # http=127.0.0.1:8000
#项目目录, 指定到项目的目录名称(通常就是manage.py文件所在目录的目录名) chdir=/root/blog/
#项目中wsgi.py文件的目录,相对于项目目录(相对目录) wsgi-file = blog/wsgi.py
# 启动4个uwsgi进程 processes=4
# uwsgi进程中的线程数 threads=2
# 进程设置,无需变更 master=True
# 启动服务器以后会生成文件uwgi.pid,在哪一个目录启动,就会在哪一个目录生成和文件 pidfile=uwsgi.pid
# 服务器启动以后在后台运行,会生成文件uwsgi.log daemonize=uwsgi.log
# 指定虚拟环境的目录 进入虚拟环境后可使用which python 查看到虚拟环境所在路径 virtualenv=/home/python/.virtualenvs/django_env_python3uwsgiuwsgi.piduswgi.log

注意:

uwsgi.ini 这个文件是uwsgi服务器的配置文件

用uwsgi服务器,须要先在settings.py设置:

  DEBUG=FALSE

  ALLOWED_HOSTS=[‘*’]

3.启动uwsgi

进入目录: /root/blog/uWSGI_setting_file/node

uwsgi在哪一个目录启动,就会在哪一个目录生成uwsgi.piduswgi.log文件。python

# 启动:(先将django自带的server服务器中止运行)
uwsgi --ini uwsgi.ini 

# 中止:
uwsgi --stop uwsgi.pid 

# 重启:
uwsgi --reload uwsgi.pid 

# 强制中止:
killall -9 uwsgi 

这里咱们启动uwsgi服务,能够经过 ps -ef | grep uwsgi 看到已经有四个uwsgi服务启动。mysql

访问项目中的某个API,测试服务器是否运行成功nginx

三. 安装和配置Nginx

1. Ubuntu系统下安装:

sudo apt-get install nginx

在服务器上建立目录结构:/root/var/blog web

修改目录权限:sudo chmod 777 /root/var/blog 

进入目录: /root/var/blog/, 而后建立static目录: mkdir static 

在配置文件setttings.py中进行配置

# 若是DEBUG=True   -> 使用项目目录下static内的静态文件 也就是STATIC_URL 所指向的路径
# 若是DEBUG=False  -> 使用STATIC_ROOT指定目录下的静态文件
STATIC_URL = '/static/'
STATIC_ROOT = '/root/var/blog/static/'

# 设置静态文件查找目录,在终端使用命令收集到项目的静态文件后,再去配置nginx服务器寻找静态文件的路径
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)
# 若是是home路径下则须要先设置目录权限
# 在模板中使用 fileObj.fileFieldName.url 表明网络可访问的资源路径
MEDIA_URL = '/media/' # 表明访问media的url路径,例如 127.0.0.1/media/1.png
# 不管是否debug,都会访问此路径下的media资源(包括上传和访问)
MEDIA_ROOT = '/var/www/NickBlog/media/'

在manage.py文件所在目录下,输入如下命令收集静态文件.

python manage.py collectstatic

 2.配置

进入目录/etc/nginx/sites-enabled/中能够看到一个default文件,修改default文件为以下内容

 
# site_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    # 设置本地服务的端口
    server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
    # the port your site will be served on
    # 监听主机的端口
    listen      80;
    # the domain name it will serve for
    # server_name .liqian.ink; # 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 /root/var/blog/media;  # your Django project's media files - amend as required
    }
    # 设置静态文件目录
    location /static {
        alias /root/var/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     uwsgi_params; # the uwsgi_params file you installed
    }
}

3.启动服务

启动服务:nginx 
查看版本:nginx -v 
重启服务:nginx -s reload 
中止服务:nginx -s stop

后续

发现一个问题,在另一台机器上部署的时候没法成功进入django进程。 
/etc/nginx/nginx.conf内容设置为以下内容后,重启成功

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}


#mail {
#   # See sample authentication script at:
#   # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#   # auth_http localhost/auth.php;
#   # pop3_capabilities "TOP" "USER";
#   # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#   server {
#       listen     localhost:110;
#       protocol   pop3;
#       proxy      on;
#   }
# 
#   server {
#       listen     localhost:143;
#       protocol   imap;
#       proxy      on;
#   }
#}

4.使用nginx实现负载均衡

在关于高并发负载均衡一文中已经提到,企业在解决高并发问题时,通常有两个方向的处理策略,软件、硬件,硬件上添加负载均衡器分发大量请求,软件上可在高并发瓶颈处:数据库+web服务器两处添加解决方案,其中web服务器前面一层最经常使用的的添加负载方案就是使用nginx实现负载均衡。

 1、负载均衡的做用

一、转发功能

按照必定的算法【权重、轮询】,将客户端请求转发到不一样应用服务器上,减轻单个服务器压力,提升系统并发量。

二、故障移除

经过心跳检测的方式,判断应用服务器当前是否能够正常工做,若是服务器期宕掉,自动将请求发送到其余应用服务器。

三、恢复添加

如检测到发生故障的应用服务器恢复工做,自动将其添加处处理用户请求队伍中。

2、Nginx实现负载均衡
一样使用两个tomcat模拟两台应用服务器,端口号分别为8080 和8081

一、Nginx的负载分发策略

      Nginx 的 upstream目前支持的分配算法: 
1)、轮询 ——1:1 轮流处理请求(默认)

      每一个请求按时间顺序逐一分配到不一样的应用服务器,若是应用服务器down掉,自动剔除,剩下的继续轮询。 
2)、权重 ——you can you up
      经过配置权重,指定轮询概率,权重和访问比率成正比,用于应用服务器性能不均的状况。 
3)、ip_哈希算法
      每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个应用服务器,能够解决session共享的问题。 

二、配置Nginx的负载均衡与分发策略

      经过在upstream参数中添加的应用服务器IP后添加指定参数便可实现,如:

  /etc/nginx/nginx.conf

   
upstream tomcatserver1 {  # tomcatserver1 这参数须要和 proxy_pass 定义的变量保持一致
    server 192.168.72.49:8080 weight=3;  权重3
    server 192.168.72.49:8081;  
    }   
  
 server {  
        listen       80;  
        server_name  8080.max.com;  
        #charset koi8-r;  
        #access_log  logs/host.access.log  main;  
        location / {  
            proxy_pass   http://tomcatserver1;  
            index  index.html index.htm;  访问主页时请求的静态文件
        }  
     } 
复制代码

      经过以上配置,即可以实现,在访问8080.max.com这个网站时,因为配置了proxy_pass地址,全部请求都会先经过nginx反向代理服务器,在服务器将请求转发给目的主机时,读取upstream为 tomcatsever1的地址,读取分发策略,配置tomcat1权重为3,因此nginx会将大部分请求发送给49服务器上的tomcat1,也就是8080端口;较少部分给tomcat2来实现有条件的负载均衡,固然这个条件就是服务器一、2的硬件指数处理请求能力。 

三、nginx其余配置

upstream myServer {    
  
    server 192.168.72.49:9090 down;   
    server 192.168.72.49:8080 weight=2;   
    server 192.168.72.49:6060;   
    server 192.168.72.49:7070 backup;   
}  

1)down

    表示单前的server暂时不参与负载

2)Weight

    默认为1.weight越大,负载的权重就越大。

3)max_fails

    容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

4)fail_timeout

    max_fails 次失败后,暂停的时间。

5)Backup

    其它全部的非backup机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。

3、使用Nginx的高可用 

      除了要实现网站的高可用,也就是提供n多台服务器用于发布相同的服务,添加负载均衡服务器分发请求以保证在高并发下各台服务器能相对饱和的处理请求。一样,负载均衡服务器也须要高可用,以防若是负载均衡服务器挂掉了,后面的应用服务器也紊乱没法工做。

     实现高可用的方案:添加冗余。添加n台nginx服务器以免发生上述单点故障。具体方案详见下文:keepalive+nginx实现负载均衡高可用

4、总结

    总结一点,负载均衡不管是各类软件或硬件上的解决方案,主要仍是将大量的并发请求按照必定的规律分发给不一样的服务器处理,从而减小某台服务器的瞬时压力,提升网站的抗并发能力。nginx在负载均衡的应用之因此普遍,笔者认为这归功于它的灵活配置,一个nginx.conf文件解决大部分问题,不管是nignx建立虚拟服务器、nginx的反向代理服务器,仍是本文介绍的nginx的负载均衡,几乎都在这个配置文件中进行。服务器上只负责把nginx搭好,跑起来便可。并且它自己轻量级,不须要占用服务器太多资源就能够达到较好的效果

 

注意:

  1. 每次修改了Django项目中的模板/视图/URL/配置文件,都须要重启uwsgi服务。
  2. 修改Nginx配置文件,都须要重启Nginx服务。

 

原文地址:  http://www.javashuo.com/article/p-tunrxqwz-be.html   https://blog.csdn.net/weixin_39198406/article/details/79277580

相关文章
相关标签/搜索