Nginx服务器
Published in:2020-10-29 |

Nginx服务器,nginx与uWSGI,集群和负载均衡策略,uWSGI服务器

Nginx服务器

一、Nginx概述

1、简介

Nginx是一款轻量级的web服务器/反向代理服务器,占内存小,并发能力强.

作用

1
2
3
静态http服务器(处理静态资源-动静分离):
首先,Nginx是http服务器,可以上传静态资源(图片,css,js文件)通过http协议展示给客户端.
将静态资源交给nginx服务器

Nginx提供动静分离是指动态的请求和静态的请求分离开,合适的服务器处理合适的请求,使整个服务系统的性能,效率更高

uWSGI更适合做动态内容的执行,nginx更适合做静态内容的处理,客户端请求直接访问nginx服务器,留下静态部分处理,动态部分转发给uWSGI服务器,实现”动静分离”

反向代理服务器

反向代理是指代理服务器nginx来接受internet上的请求,然后将请求转发给内部网络上的其他服务器uWSGI,并将uWSGI服务器上的得到的结果返回给Internet上请求的客户端,此时代理服务器对外表现为反向代理服务器.

代理均衡

多在高并发情况下需要使用,原理时将数据流量分摊成多个服务器执行,减轻每台服务器的压力,多服务器(集群)共同完成工作任务,从而提高数据的吞吐量.

2、安装步骤

  • 将tar包发送的linux

  • 解压 tar -zxvf nginx-1.11.1.tar.gz

  • 安装依赖 yum install gcc zlib-devel pcre-devel

  • cd到解压目录:./configure #配置检测

  • cd到解压目录:make && make install #编译并安装

  • 安装完成,安装路径为/usr/local/nginx ,日志路径为 /usr/local/nginx/logs ,

    可执行文件路径为 /usr/local/nginx/sbin ,配置文件路径为 /usr/local/nginx/conf

    欢迎页面路径为 /usr/local/nginx/html

  • ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx 制作连接,便于执行nginx指令

  • nginx #启动
    nginx -s stop #关闭
    nginx -s reload #重启

    http://ip:80即可访问nginx欢迎页面

二、nginx与uWSGI

nginx配置–到配置路径中的nginx.conf /usr/local/nginx/conf/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
upstream ems{
server 192.168.157.141:9001; # uWSGI's socket =
#server 192.168.157.142:9001; #192.168.x.x:9001
#可以在添加其他的uWSGI的服务器
}

server {
listen 80;
server_name 192.168.157.142; # nginx服务器的ip
charset utf-8;

location / {
uwsgi_pass ems; #和上面的upstream转接
include /usr/local/nginx/conf/uwsgi_params; # the uwsgi_params file you installed
}
location /static { #http://ip:80/static/a/b/c/d.png ==> /usr/local/static/a/b/c/d.png
alias /usr/local/static; # your Django project's static files - amend as required
}
...

配置好后,重启nginx即可,可以使用Nginx服务器来访问项目

注意关闭防火墙!!

两台虚拟主机,一个运行nginx,其中保存project的静态资源;一个运行uwsgi,其中保存并部署project。

三、集群和负载均衡策略

搭建uWSGI集群,只需要多做几份uWSGI的配置文件,文件中设置不同的ip:port,指向相同的project,然后启动多个uWSGI即可。

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
33
34
35
36
37
38
39
40
41
42
43
*默认:轮询
upstream django {
server 192.168.0.103:8989;
server 192.168.0.104:8989;
}
*iphash:基于ip的负载均衡.
upstream django {
ip_hash;
server 192.168.0.103:8989;
server 192.168.0.104:8990;
}
*权重轮询:
upstream django {
server 192.168.0.103:8989 weight=1;
server 192.168.0.104:8990 weight=2;
}
*最小连接数:
upstream django {
least_conn;
server 192.168.0.103:8989;
server 192.168.0.104:8990;
}*默认:轮询
upstream django {
server 192.168.0.103:8989;
server 192.168.0.104:8989;
}
*iphash:基于ip的负载均衡.
upstream django {
ip_hash;
server 192.168.0.103:8989;
server 192.168.0.104:8990;
}
*权重轮询:
upstream django {
server 192.168.0.103:8989 weight=1;
server 192.168.0.104:8990 weight=2;
}
*最小连接数:
upstream django {
least_conn;
server 192.168.0.103:8989;
server 192.168.0.104:8990;
}

至此,一个uWSGI集群搭建完成,nginx作为反向代理服务器和web服务器接收请求,然后处理静态的部分,动态部分按照负载均衡策略转发给某一个uWSGI服务器。

四、uWSGI服务器

1、WSGI协议

  • 使用Django或Flask框架编写的Web应用程序,在python manage.py runserver 时都启动的是框架内置的服务器来运行Web应用程序,而内置的服务器遵循了WSGI协议(WSGI Server)。

  • WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。

    • WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;

    • WSGI application接收由server转发的request,处理请求,并将处理结果返回给server

  • 要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有BottleFlaskDjango

总结:WSGI是Web 服务器(uWSGI)与 Web 应用程序或应用框架(Django)之间的一种低级别的接口。

2、uWSGI服务器安装

WSGI协议下web服务器很多:django内置,uWSGI,gunicorn。

2.1 服务器安装
  • 将uWSGI的tar包发送linux

  • 解压tar:tar -zxvf uwsgi-2.0.17.tar.gz

  • cd到解压目录下,编译:make

  • 为了可以更方便的执行 uwsgi 启动uWSGI服务器,定制链接:

    ln -s /usr/local/uwsgi-2.0.17/uwsgi /usr/bin/uwsgi

    则可以在任意目录下执行 uwsgi 去启动uWSGI服务器

  • 测试使用python的wsgi服务器-uWSGI

    • 在任意的一个目录中定义一个python脚本:hello.py

      1
      2
      3
      def application(env, start_response):
      start_response('200 OK', [('Content-Type','text/html;charset=utf-8')])
      return [bytes('你好啊!!','utf-8'),b'Mr_lee'] # 基于wsgi协议规范实现的代码
    • 启动uWSGI服务器,并部署hello.py程序

      uwsgi --http 192.168.248.128:8001 --wsgi-file hello.py #注意hilo.py可以写成绝对路径

    • 浏览器访问:192.168.248.128:8001

3、 uWSGI部署django项目

  • 在数据库中建好项目需要的database:“ems”

    • 使用Navicat创建即可,注意字符集为 utf8
  • 在Django项目的settings.py中修改配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DEBUG = False  #去掉开发模式          
    ALLOWED_HOSTS = ["*"] #开放访问host
    DATABASES = { #合适数据库参数
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'ems',
    'USER': 'root',
    'HOST': 'localhost',
    'PORT': '3306',
    'PASSWORD': '123456'
    }
    }

  • 发送项目到linux并做移植

    python manage.py makemigrations

    python manage.py migrate

  • 编写uWSGI的配置文件

    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
    #随意找一个目录,创建一个文件:config.ini -- 建议放在项目的根目录下
    [uwsgi]
    http = 192.168.134.128:9000 # uWSGI服务器访问地址
    #uWSGI和nginx通信的port
    socket = 192.168.134.128:9001
    # the base directory (full path)
    chdir = /usr/local/django_projects/ems #项目所在目录
    # Django's wsgi file
    wsgi-file = ems/wsgi.py #基于项目目录的相对路径
    # maximum number of worker processes
    processes = 4
    #thread numbers startched in each worker process
    threads = 2
    #monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况
    stats = 192.168.134.128:9002
    # clear environment on exit
    vacuum = true
    pidfile = /usr/local/django_projects/ems/uwsgi.pid #进程ID存放于此文件,位置可以自定义
    #daemonize-run ,file-to-record-log
    daemonize = /usr/local/django_projects/ems/uwsgi.log #后台启动模式,日志文件记录位置自定义
    #http://ip:port/static/...请求会进入该目录找资源,此处可以指向某个app下的static目录
    #或是将所有静态文件汇总到项目的某一个目录下,然后配置在此是更好的选择
    #汇集所有已安装app的静态资源到一个目录下,请参见后续内容
    #http://ip:port/static/a/b/c/d.png ==> /usr/local/xxxx/static/a/b/c/d.png
    static-map =/static=/usr/local/xxx/static # 只在你写的static-map中找静态资源
  • 根据如上配置启动uWSGI服务器

    uwsgi --ini config.ini #注意:config.ini是一个相对路径

  • 关闭服务器

    uwsgi --stop uwsgi.pid #通过进程id文件

  • 使用uwsgi服务器运行项目后,出现静态资源无法加载的问题

1
2
3
4
5
6
# 分析原因: 
1.在django内置的服务器中,调试模式,django查找静态资源默认在每个app的static目录
2. 或者可以在setting.py文件中
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')] 将项目根目录下的static目录作为静态资源的查找路径

# 但是uwsgi服务器有自己的静态资源的处理方式,也就是它不会在上述的两个地方查找静态资源
  • uwsgi如何处理静态资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在config.ini配置文件的最后面来告诉uwsgi服务器要在哪里去找静态资源
[uwsig]
http = xxx:9000
socket = xxx:9001
...
...
...
# 写你的静态资源的绝对路径,如果在项目根目录下,直接写项目根目录/static即可
# 如果是每个app自己管理,把所有的app的static目录添加进来,有几个app加几个static-map
static-map=/static=/usr/local/xxx/static

url可以分为两大类:
1. 普通url-动态资源url 会在urls.py文件中匹配访问路径 最终找到视图函数
2. 静态资源url-- /static/ 告诉django当url中有/static/时django会在静态资源的目录下去查找资源
  • 如果你的app过多,每个app自己管理静态资源,此时需要添加的static-map太多
1
2
3
4
5
6
# 只需要做两步操作就可以把所有app下的静态资源static目录的文件收集到某一个目录下

1. 在项目的setting.py文件中添加 STATIC_ROOT=os.path.join(BASE_DIR,'static')
用于告诉django,将来收集到的静态资源往哪里放

2. 执行收集的指令 python manage.py collectstatic

STATIC_URL = ‘/static/‘ # 每个静态资源URL的访问前缀

STATICFIELS_DIRS = [os.path.join(BASE_DIR,’static’)] # 添加django内置服务器查找静态资源的路径

STATIC_ROOT = os.path.join(BASE_DIR,’static’) # 收集静态资源时的路径

static-map=/static=xxxx # 告诉uwsgi服务器到哪里去找静态资源

Prev:
js加密破解
Next:
eval()函数