Nginx动静分离 负载均衡 反向代理

本文详细介绍了Nginx的高级配置技巧,包括动静分离、反向代理、负载均衡策略及TCP反向代理等,深入解析如何通过Nginx提升网站性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。动静分离技术其实是采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。在Nginx的配置中,是通location配置段配合正则匹配实现静态与动态页面的不同处理方式

1.前端Nginx收到静态请求,直接从NFS中返回给客户端。
2.前端Nginx收到动态请求转交给通过FastCGI交给PHP服务器处理。
----如果得到静态结果直接从NFS取出结果交给Nginx然后返回给客户端。
----如果需要数据处理PHP服务器连接数据库后将结果返回给Nginx
3.前端Nginx收到图片请求以.jpg、.png、.gif等请求交给后端Images服务器处理。

server {
  listen 80;
  server_name localhost;
    index index.php index.html;
    root /app/blog; 

  location ~* \.(css|js)$ { #NFS
    root /var/html/static
   }

  location ~* \.(png|ico|gif|jpg|jpeg)$ { #location匹配将图片交给Image处理
        proxy_pass http://10.10.0.23:80; #Image服务器要开启web服务
   }

    location ~* \.php$ { 
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/html/yd_laravel/public$fastcgi_script_name;
    include /usr/local/nginx/conf/fastcgi_params;
    }
}

proxy_pass配置实现反向代理功能。执行 telnet 10.10.0.23,验证成功

nginx反向代理真实IP

在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址。何为真实IP地址呢?请看下图,既获取到的真实客户端IP是101,既不是正向代理服的104,也不是反向代理的105

proxy_set_header配置获取真实IP,upstream联合proxy_pass实现负载均衡

upstream phpserver {
	server 10.141.8.55:8005;
	server 10.141.8.55:8006;
}
server {
	listen 80;
	server_name www.xxx.com;
	log_not_found off;
	access_log  /var/log/nginx/html-access.log  main;
	charset utf-8;
	location / {
		proxy_pass http://phpserver;
		proxy_redirect off;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header REMOTE-HOST $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		
		proxy_connect_timeout 3600;            
		proxy_send_timeout 3600;              
		proxy_read_timeout 3600;              
		proxy_buffer_size 256k;               
		proxy_buffers 4 256k;                 
		proxy_busy_buffers_size 256k;        
		proxy_temp_file_write_size 256k;      
		proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
		proxy_max_temp_file_size 128m;
	}
}
PHP脚本打印IP
<?php
foreach($_SERVER as $k=>$v)
	echo $k . '=' . $v . '<br />';

在默认配置情况下,如果要取得客户端真实IP地址的话,只有取HTTP_X_FORWARDED_FOR的第一个逗号前的IP地址最靠谱

 

nginx的TCP的反向代理

Nginx默认只支持http的反向代理,nginx在1.9版本之后想要支持tcp的反向代理,需要在编译时增加tcp代理模块

stream {
    upstream backend_server {
        server 10.100.138.15:8787;
        server 10.100.138.30:8787;
    }
}

nginx做TCP代理并不仅仅局限于WEB的URL请求,还可以转发如memcached、MySQL等点到点的请求。TCP负载均衡原理上和LVS等是一致的,工作在更为底层,性能会高于原来HTTP负载均衡不少

 

nginx的反向代理服务同时使用Http-basic模块来做HTTP验证

@用于定义一个 Location 块,且该块不能被外部 Client 所访问,只能被 Nginx 内部配置指令所访问,比如 try_files or error_page

upstream elasticsearch {
    server 127.0.0.1:9200;
}

server {
   location / {
        error_page 590 = @elasticsearch;
        error_page 595 = @protected_elasticsearch;
        if ($request_uri ~ ^/_cat/.*$) {
            return 590;
        }
        return 595;
    }

    location @elasticsearch {
        proxy_pass http://elasticsearch;
        proxy_redirect off;
    }

    location @protected_elasticsearch {
        auth_basic           "Protected Elasticsearch";
        auth_basic_user_file passwords;

        proxy_pass http://elasticsearch;
        proxy_redirect off;
    }
}

我们定义两个状态代码:590-不需要验证,595-需要验证,使用nginx的location功能,两个location都指向同一个集群,但是其中一个需要认证

 

添加$_SERVER服务器环境变量

在PHP开发中为了区分线上生产环境还是本地开发环境

如果我们能通过判断$_SERVER['APP_DEV']为 'DEV'还是'PRO'来区分该多好

include           fastcgi_params;
fastcgi_param     SCRIPT_FILENAME  $document_root$fastcgi_script_name;
fastcgi_param     APP_DEV 'PRO'; # PRO or DEV

 

Nginx负载均衡策略

nginx的负载均衡策略可以划分为两大类:内置策略和扩展策略。
内置策略包含加权轮询和ip hash,在默认情况下这两种策略会编译进nginx内核,只需在nginx配置中指明参数即可。扩展策略有很多,如fair、通用hash、consistent hash等,默认不编译进nginx内核。

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backserver {
    server 192.168.0.14;
    server 192.168.0.15;
}
2、weight(权重轮询策略)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
    server 192.168.0.14 weight=3;#30%
    server 192.168.0.15 weight=7;
}
权重越高,在被访问的概率越大,如上例,分别是30%,70%。

 

上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
3.ip_hash
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。用ip_hash做会话保持有很大的缺陷,它是通过客户端ip来实现,负载不会很均匀
upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}
4、fair(第三方upstream-fair模块)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
    server server1;
    server server2;
    fair;
}
5、url_hash(第三方nginx_upstream_hash模块)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

6.Sticky策略(第三方nginx-sticky-module模块)

它是基于cookie的一种nginx的负载均衡解决方案,通过分发和识别cookie,来使同一个客户端的请求落在同一台服务器上,可以解决session的问题
upstream backserver{
    sticky;
    server 172.31.3.82:9170;
    server 172.31.3.82:9171;
    server 172.31.3.82:9173;
}
upstream的参数列表如下:

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

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

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

4.fail_timeout:max_fails次失败后,暂停的时间。

5.backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

6. keepalive:连接数(keepalive的值)指定了每个工作进程中保留的持续连接到nginx负载均衡器缓存的最大值。如果超过这个设置值的闲置进程想链接到nginx负载均衡器组,最先连接的将被关闭。

7. location对URL进行匹配.可以进行重定向或者进行新的代理负载均衡

注:nginx支持同时设置多组的负载均衡,用来给不用的server来使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值