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

  

 

原文地址:https://www.cnblogs.com/abc1234567/p/14221497.html