nginx 代理服务器、负载均衡配置

        虚拟机Linux环境服务器1台:192.168.216.164.

        

        什么是反向代理?

        反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

冷暖自知一抹茶ck

        Nginx是个厉害的服务器,可以配置多个服务器,一个server就是一个服务器

server {
      listen       80;
      server_name  *.yourdomain.com;
      ....
}

        代理转发是在server下面的location进行配置

server {
   // 服务器配置

   location  / {
       // ...... 代理配置
   }
}

        常见的Nginx代理配置

upstream my_server {                                                        
    server 10.0.0.2:8080;                                               
    keepalive 2000;

}

server {
    listen       80;                                                        
    server_name  10.0.0.1;                                              
    client_max_body_size 1024M;

    location /my/ {
        proxy_pass http://my_server/;
        proxy_set_header Host $host:$server_port;

    }
}


本地添加host :

192.168.216.164 www.laravel.com

那么,访问nginx地址www.laravel.com/my的请求会被转发到zp_server1服务地址 192.168.216.164:8080/my/ 。


nginx.conf添加配置  upstream:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


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"';
    
    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;


    upstream zp_server1{
        server 192.168.216.164:8080;
    }


    server {
        listen       80;
        server_name  localhost;
        
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        include /usr/local/nginx/vhosts/*;
}

修改 vhost/www.laravel.conf 配置文件:

server {
     listen 80;
     server_name laravel.com www.laravel.com;
     root /usr/local/nginx/html/www.laravel.com;
     #access_log /www/access_ abc.log main;
     location / {
         index index.php index.html index.htm;
     }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/www.laravel.com$fastcgi_script_name;
        include fastcgi_params;
    }

    location /my/ {

        proxy_pass http://zp_server1/my/;

        proxy_set_header Host $host:$server_port;

    }

    location ~ /\.ht {
        deny all;
    }
}

新增转发到的配置   vhosts/www.yii.conf:

server {
     listen 8080;
     server_name 192.168.216.164:8080;
     root /usr/local/nginx/html/www.yii.com;
     #access_log /www/access_abc.log main;
     location / {
         index index.php index.html index.htm;
     }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/www.yii.com$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~ /\.ht {
        deny all;
    }
}
  1. 重新启动nginx,使配置生效。

  2. 本机访问http://www.laravel.com/my/ ,注意启动绑定的端口要和 nginx 中的 upstream 设置的端口保持一致。  

冷暖自知一抹茶ck



负载均衡(负载均衡实现利用服务器集群处理客户端请求,提高访问效率,降低服务器响应压力。)

        前面的例子中,代理仅仅指向一个服务器,但是,网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。

        nginx 也可以实现简单的负载均衡功能。

        冷暖自知一抹茶ck

        假设这样一个应用场景:将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台 linux 环境的服务器上。网站域名叫 www.helloworld.com,公网 IP 为 192.168.1.11。在公网 IP 所在的服务器上部署 nginx,对所有请求做负载均衡处理(下面例子中使用的是加权轮询策略)。

        nginx.conf 配置如下:

http {     
    #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;    default_type  application/octet-stream;    
    #设定日志格式
    access_log    /var/log/nginx/access.log;    
    #设定负载均衡的服务器列表
    upstream load_balance_server {        
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.1.11:80   weight=5;        
        server 192.168.1.12:80   weight=1;        
        server 192.168.1.13:80   weight=6;
    }   
    #HTTP服务器
    server {        
        #侦听80端口
        listen       80;        
        #定义使用www.xx.com访问
        server_name  www.helloworld.com;        
        #对所有请求进行负载均衡请求
        location / {            
            root        /root;                 #定义服务器的默认网站根目录位置
            index       index.html index.htm;  #定义首页索引文件的名称
            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表

            #以下是一些反向代理的配置(可选择性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;            
            proxy_set_header X-Real-IP $remote_addr;            
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $remote_addr;            
            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传

            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

负载均衡策略:

        1. Nginx 提供了多种负载均衡策略,让我们来一一了解一下:

        轮询

upstream bck_testing_01 {
    # 默认所有服务器权重为 1
    server 192.168.250.220:8080
    server 192.168.250.221:8080
    server 192.168.250.222:8080
}

        加权轮询

upstream bck_testing_01 {
    server 192.168.250.220:8080   weight=3
    server 192.168.250.221:8080              # default weight=1
    server 192.168.250.222:8080              # default weight=1
}

        最少连接

upstream bck_testing_01 {
    least_conn;

    # with default weight for all (weight=1)
    server 192.168.250.220:8080
    server 192.168.250.221:8080
    server 192.168.250.222:8080
}

        加权最少连接

upstream bck_testing_01 {
    least_conn;

    server 192.168.250.220:8080   weight=3
    server 192.168.250.221:8080              # default weight=1
    server 192.168.250.222:8080              # default weight=1
}

        IP Hash

upstream bck_testing_01 {

    ip_hash;

    # with default weight for all (weight=1)
    server 192.168.250.220:8080
    server 192.168.250.221:8080
    server 192.168.250.222:8080
}

        普通 Hash

upstream bck_testing_01 {

    hash $request_uri;

    # with default weight for all (weight=1)
    server 192.168.250.220:8080
    server 192.168.250.221:8080
    server 192.168.250.222:8080
}

        2. 一些重要的命令和参数

        在定义集群服务器中,某个服务器后通过以下命令和参数实现重要功能

        1)down:表示该服务器下线,不参与负载均衡;

        2)backup:表示该服务器为备份服务器,当集群中其他服务器宕机时可用

        3)max_fails:表示该服务器处理客户端请求经过几次失败后认定该服务器宕机,默认为1

        4)fail_timeout:单独使用时表示该服务器被认为宕机后,经过多久会再次被尝试加入集群,默认为10S

        5)max_conns:表示该服务器允许连接数的上限,默认为0即无限制

upstream test {
    server 127.0.0.1:8001   down ; 
    server 10.10.11.85:8001  backup; 
    server 10.10.11.86:8001 max_fails=2 fail_timeout=30s; 
    server 10.10.11.87:8001 max_fails=2 fail_timeout=30s; 
}

        通常max_fails和fail_timeout配合使用,表示在fail_timeout内失败max_fails次以后,认为该服务器宕机,然后再等待fail_timeout后,再尝试与该服务器通信。


网站有多个 webapp 的配置:

        当一个网站功能越来越丰富时,往往需要将一些功能相对独立的模块剥离出来,独立维护。这样的话,通常,会有多个 webapp。

        举个例子:假如 www.helloworld.com 站点有好几个 webapp,finance(金融)、product(产品)、admin(用户中心)。访问这些应用的方式通过上下文(context)来进行区分:

        www.helloworld.com/finance/

        www.helloworld.com/product/

        www.helloworld.com/admin/ 

        我们知道,http 的默认端口号是 80,如果在一台服务器上同时启动这 3 个 webapp 应用,都用 80 端口,肯定是不成的。所以,这三个应用需要分别绑定不同的端口号。

        那么,问题来了,用户在实际访问 www.helloworld.com 站点时,访问不同 webapp,总不会还带着对应的端口号去访问吧。所以,你再次需要用到反向代理来做处理。

http {	
    #此处省略一些基本配置

    upstream product_server{		
        server www.helloworld.com:8081;
    }	
    upstream admin_server{		
        server www.helloworld.com:8082;
    }	
    upstream finance_server{		
        server www.helloworld.com:8083;
    }	
    server {		
        #此处省略一些基本配置
        #默认指向product的server
        location / {			
            proxy_pass http://product_server;
        }		
        location /product/{			
            proxy_pass http://product_server;
        }		
        location /admin/ {			
            proxy_pass http://admin_server;
        }		
        location /finance/ {			
            proxy_pass http://finance_server;
        }
    }
}


搭建文件服务器:

        有时候,团队需要归档一些数据或资料,那么文件服务器必不可少。使用 Nginx 可以非常快速便捷的搭建一个简易的文件服务。

        Nginx 中的配置要点:

  •         将 autoindex 开启可以显示目录,默认不开启。 

  •         将 autoindex_exact_size 开启可以显示文件的大小。 

  •         将 autoindex_localtime 开启可以显示文件的修改时间。 

  •         root 用来设置开放为文件服务的根路径。 

  •         charset 设置为 charset utf-8,gbk;,可以避免中文乱码问题(windows 服务器下设置后,依然乱码,本人暂时没有找到解决方法)。

一个最简化的配置如下:

autoindex on;# 显示目录
autoindex_exact_size on;# 显示文件大小
autoindex_localtime on;# 显示文件时间
server {    
    charset      utf-8,gbk; # windows 服务器下设置后,依然乱码,暂时无解
    listen       9050 default_server;    
    listen       [::]:9050 default_server;    
    server_name  _;    
    root         /share/fs;
}



动静分离:

        动静分离就是将动态资源和静态资源分开;动态资源包括需要访问数据库获得的数据;静态资源如图片、html、CSS等文件。

        动静分离的方式有多种,动态资源和静态资源分别部署在不同服务器或者同一服务器的不同路径下,也可以是在访问时通过location块Nginx中location块配置入门 中与正则字符串的匹配(后缀模式)区分出动态资源和静态资源,从而代理到不同服务器中进行处理,例如:

        不区分大小写的匹配模式,以.css结尾的文件,在/res/css/lead/中寻找该css文件。

location ~* \.css$ {		    
    root /res/css/lead/;
}


冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论