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%。
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来使用。