• Nginx负载均衡实战


    反向代理参数优化

    对于nginx众多的虚拟主机配置,如果写入一个文件里,难以维护,阅读,可以把参数配置,写入到单独的配置文件中,再通过nginx的include 方式获取。

    【合适的写法】

    /opt/nginx/conf/nginx.conf

    # 定义web服务器地址池,也就是121,122两个节点
    upstream www_pools {
    server 192.168.178.121 weight=1;
    server 192.168.178.122 weight=2;
    }
    
        server {
            listen       80;
            server_name  www.chaoge.com;
            default_type application/octet-stream;
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                    proxy_pass http://www_pools;
                    # 包含语法,读取该文件中的配置,加载到当前文件中
                    include proxy.conf;
            }
    }
    

     生成规范的代理配置文件,注意和nginx.conf写在同一级目录

    [root@lb01 conf]# cat proxy.conf
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_connect_timeout 60;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    

     

    反向代理企业案例

    该场景是,通过nginx实现动静分离,配置反向代理规则,实现动态请求和静态请求分别转发给不同的服务器解析,以解决网站性能,安全,用户体验等问题。

     【配置静态服务器池】

    upstream static_pools {
    server 192.168.178.121 weight=1;
    }
    

    【配置上传服务器池】

    upstream upload_pools {
        server 192.168.178.122 weight=1;
    }
    

    【默认地址池,动态地址池】

    upstream default_pools {
        server 192.168.178.131 weight=1;
    }
    

      

    实际配置思路

    【方案1】

    location /static/ {
        proxy_pass http://static_pools;
        include proxy.conf;
    }
    
    location /upload/ {
    proxy_pass http://upload_pools;
    include proxy.conf;
    }
    
    location / {
    proxy_pass http://default_pools;
    include proxy.conf;
    }
    

      

    【方案2】

    if ($request_url ~* "^/static/(.*)$")
    {
        proxy_pass http://static_pools/$1;
    }
    
    if ($request_url ~* "^/upload/(.*)$")
    {
        proxy_pass http://uoload_pools/$1;
    }
    
    location / {
        proxy_pass http://default_pools;
        include proxy.conf;
    }
    

      

    Nginx实战配置

    1.编辑nginx.conf,修改添加如下代码
    
    # 定义三个地址池
    upstream static_pools {
            server 192.168.178.121 weight=1;
    }
    
    upstream uoload_pools {
            server 192.168.178.122 weight=1;
    }
    
    upstream default_pools {
            server 192.168.178.131 weight=1;
    }
    
    # 定义虚拟主机
        server {
            listen       80;
            server_name  www.chaoge.com;
            default_type application/octet-stream;
    
    # 通过locaiton进行URL路径匹配
            location / {
                    proxy_pass http://default_pools;
                    include proxy.conf;
            }
    
            location /static/ {
                    proxy_pass http://static_pools;
                    include proxy.conf;
    }
    
            location /upload/ {
                    proxy_pass http://upload_pools;
                    include proxy.conf;
    }
    
    }
    

     

    配置三个地址池

    【修改静态服务器配置】

    创建一个static文件夹,因为请求转发给了此台机器,URL如下
    www.chaoge.com/static/index.html  
    # 必须在网页站点目录下,存在该static文件夹
    

      

    [root@web01 logs]# mkdir -p /opt/nginx/html/www/static/
    [root@web01 logs]# echo "我是超哥配置的静态服务器static" > /opt/nginx/html/www/static/index.html
    
    修改nginx.conf支持中文
    server {
    listen 80;
    server_name www.chaoge.com;
    charset utf-8;
    location / {
            root html/www;
            index index.html index.htm;
    }
    access_log logs/access_www.log main;
    }
    
    
    # 重启nginx
    nginx -s reload
    

    【修改upload服务器配置】

    [root@web02 nginx-1.16.0]# mkdir -p /opt/nginx/html/www/upload/
    [root@web02 nginx-1.16.0]# echo "我是超哥配置的uploads服务器" > /opt/nginx/html/www/upload/index.html
    
    
    # 让nginx支持中文
    server {
    listen 80;
    server_name www.chaoge.com;
    charset utf-8;
    location / {
        root html/www;
        index index.html index.htm;
    }
    access_log logs/access_www.log main;
    }
    
    
    
    # 重启nginx
    nginx -s reload
    

    【配置默认的动态服务器】

    1.确保nginx.conf配置文件正确
     server {
            listen       80;
            server_name  www.chaoge.com;
                  # 让nginx支持中文
            charset utf-8;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html/www;
                index  index.html index.htm;
            }
    }
    
    2.生成首页文件
    [root@web03 nginx-1.16.0]# mkdir -p /opt/nginx/html/www/static
    [root@web03 nginx-1.16.0]# cat /opt/nginx/html/www/staticindex.html
    <meta charset=utf8>
    我是超哥配置默认动态服务器
    
    
    3.启动nginx,或者重启 nginx -s reload
    nginx
    

      

    URL转发应用场景

    根据http的url转发的场景,被称之为七层转发,然而LVS的负载均衡 一般用于TCP的转发,也就被称之为4层转发。

    利用nginx的七层转发,可以实现动静分离,移动,pc端页面区分,交给不同的后端服务器处理,让用户得到更佳的访问体验。

    客户端设备匹配转发实战

    对于大多数网站,都是由区分移动端页面,pc端页面,对于用户不同的客户端设备,返回不同的网页。

     

     

     【curl命令客户端】

    [root@web02 nginx-1.16.0]# curl www.chaoge.com/static/index.html
    我是超哥配置的静态服务器static
    
    # 日志记录如下
    192.168.178.130 - - [23/Mar/2020:01:59:34 -0400] "GET /static/index.html HTTP/1.0" 200 43 "-" "curl/7.29.0" "192.168.178.122"
    

    【safari】

    192.168.178.130 - - [23/Mar/2020:02:00:36 -0400] "GET /static/ HTTP/1.0" 200 43 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15" "192.168.178.1"
    

    【chrome】

    192.168.178.130 - - [23/Mar/2020:02:01:43 -0400] "GET /static/index.html HTTP/1.0" 200 43 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" "192.168.178.1"
    

      

    nginx根据客户端信息转发配置

    = 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。
    ~ 表示该规则是使用正则定义的,区分大小写。
    ~* 表示该规则是使用正则定义的,不区分大小写。
    ^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找。
    
    ###########################
    利用shell语句进行逻辑判断
    
    location / {
    # 这里进行浏览器判断
    if ($http_user_agent ~* "MSIE")
    {
        proxy_pass http://static_pools;
    }
    if ($http_user_agent ~* "Chrome")
    {
        proxy_pass http://upload_pools;
    }
    
    if ($http_user_agent ~* "Safari")
    {
        proxy_pass http://static_pools;
    }
    
    proxy_pass http://default_pools;
    include proxy.conf;
    
    }
    

      

    Nginx实际配置

    [root@lb01 conf]# grep -Ev "^#|^$" /opt/nginx/conf/nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';    
        sendfile        on;
        keepalive_timeout  65;
    upstream www_pools {
    server 192.168.178.121 weight=1;
    server 192.168.178.122 weight=2;
    }
    upstream static_pools {
        server 192.168.178.121 weight=1;
    }
    upstream upload_pools {
        server 192.168.178.122 weight=1;
    }
    upstream default_pools {
        server 192.168.178.131 weight=1;
    }
        server {
            listen       80;
            server_name  www.chaoge.com;
        default_type application/octet-stream;
    
    # 修改如下代码
    # 我们这里直接返回状态码,更直观看见区别,也可以编写proxy_pass
    location / {
    
    if ($http_user_agent ~* "MSIE")
    {
            proxy_pass http://static_pools;
    }
    if ($http_user_agent ~* "Chrome")
    {
            #proxy_pass http://upload_pools;
            return 401;
    }
    
    if ($http_user_agent ~* "Safari")
    {
            #proxy_pass http://static_pools;
            return 402;
    }
    
    proxy_pass http://default_pools;
    include proxy.conf;
    
    }
    
    
    
    
    
    }
    }
    

      

     

     检测移动端

    1.修改nginx.conf支持移动端检测,修改部分代码如下
    
    location / {
    
    if ($http_user_agent ~* "android")
    {
    return "501";
    }
    
    if ($http_user_agent ~* "iphone")
    {
    return "502";
    }
    
    proxy_pass http://default_pools;
    include proxy.conf;
    
    }
    
    
    # 重启
    nginx -s reload
    

    【直接通过curl命令,模拟客户端发起http请求】

    [root@lb01 conf]# curl -A "android" www.chaoge.com
    <html>
    <head><title>501 Not Implemented</title></head>
    <body>
    <center><h1>501 Not Implemented</h1></center>
    <hr><center>nginx/1.16.0</center>
    </body>
    </html>
    [root@lb01 conf]#
    [root@lb01 conf]#
    [root@lb01 conf]# curl -A "iphone" www.chaoge.com
    <html>
    <head><title>502 Bad Gateway</title></head>
    <body>
    <center><h1>502 Bad Gateway</h1></center>
    <hr><center>nginx/1.16.0</center>
    </body>
    </html>
    

      

    通过文件扩展名转发

    【方法1】

    location ~ .*.(gif|jpgjpeg|png|bmp|swf|css|js)$ {
            # proxy_pass http://static_pools;
            # include proxy.conf;
            return 503;
    }
    
    # 重启nginx -s reload
    

    【方法2】

    if ($request_uri ~* ".*.(php|php5)$")
    {
        proxy_pass http://php_server_pols;
    }
    
    if ($request_uri ~* ".*.(jsp|jsp*|do|do*)$")
    {
        proxy_pass http://java_server_pools;
    }
    

      

    Nginx根据请求扩展名转发实践

    据此可以实现用户请求动静分离,例如图片,视频等请求静态资源服务器

    php,jsp,等动态请求转发给动态服务器

    # 修改nginx.conf添加如下代码
    
        server {
            listen       80;
            server_name  www.chaoge.com;
            default_type application/octet-stream;
    
    
    
              location / {
    
              if ($http_user_agent ~* "MSIE")
              {
                      proxy_pass http://static_pools;
              }
              if ($http_user_agent ~* "Chrome")
              {
                      #proxy_pass http://upload_pools;
                      return 401;
              }
    
              if ($http_user_agent ~* "Safari")
              {
                      #proxy_pass http://static_pools;
                      return 402;
              }
              if ($http_user_agent ~* "android")
              {
              return "501";
              }
    
              if ($http_user_agent ~* "iphone")
              {
              return "502";
              }
    
              proxy_pass http://default_pools;
              include proxy.conf;
    
              }
    
              location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
                      # proxy_pass http://static_pools;
                      # include proxy.conf;
                      return 503;
              }
    
              location ~ .*.(php|php3|php5)$ {
                      return 504;
              }
    
    
              }
    
    # 重启nginx
    nginx -s reload
    

      

     

  • 相关阅读:
    写给新的一年(2015)
    Lucene.Net 入门级实例 浅显易懂。。。
    EF webapi json序列化 表间相互引用 无限循环问题解决方案
    java枚举使用详解,整理的很好,只能收下。。。
    mac
    ASP.NET Web API 全局权限和异常处理
    c# 与 java 语法异同
    tfs 报错解决方案:tf400324
    使用C#开发ActiveX控件
    android 更新listview 其中一行的数据显示
  • 原文地址:https://www.cnblogs.com/abc1234567/p/14221497.html
Copyright © 2020-2023  润新知