0、nginx代理
反向代理的代码如下:
在虚拟主机中设置如下:
正向代理:
Nginx正向代理配置执行说明
resolver 语法:resolver address;
address为DNS服务器的地址,国内通用的DNS 119.29.29.29为dnspod公司提供。 国际通用DNS 8.8.8.8或者8.8.4.4为google提供。 其他可以参考 http://dns.lisect.com/
示例:resolver 119.29.29.29; default_server 之所以要设置为默认虚拟主机,是因为这样就不用设置server_name了,任何域名解析过来都可以正常访问。 proxy_pass 该指令用来设置要代理的目标url,正向代理服务器设置就保持该固定值即可。关于该指令的详细解释在反向代理配置中。
一、负载均衡
1、什么是负载均衡
nginx仅仅作为nginx proxy反向代理使用,因为这个反向代理功能表现的效果就是负载均衡集群的效果,所以就称为nginx负载均衡。
反向代理与负载均衡的区别:
普通负载均衡软件,例如LVS,其实现的功能只是对请求数据包的转发(也可能会改写数据包)、传递,其中DR模式明显的特征是从负载均衡下面的节点服务来看,接收到的请求还是来自访问负载均衡器的客户端的真实用户;而反向代理就不一样了,反向代理接收访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问的节点服务器的客户端用户就是反向代理服务器了,而非真实的网站访问用户。
总之,负载均衡转发用户请求的数据包,而nginx反向代理是接收用户的请求然后重新发起请求去请求其后面的节点。
实现nginx负载均衡的组件主要有两个:
ngx_http_proxy_module:proxy代理模块,用于把请求后抛给服务器节点或upstream服务器池。
ngx_http_upstream_module:负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查。
2、nginx upstream模块
nginx负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等。
** server标签参数说明:**
server 192.168.10.203:80 负载均衡后面的RS(Real Server)配置,可以是IP或域名,如果端口不写,默认是80端口。高并发场景下,IP可以换成域名,通过DNS做负载均衡。
weight=1 代表服务器权重,默认是1。权重数字越大表示接收的请求比例越大。
max_fails=1 nginx尝试连接后端主机失败的次数。这个数值是配合proxy_next_upstream、fastcgi_next_upstream和memcached_next_upstream这三个参数来使用的。当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404、502、503。max_fails默认是1,企业场景建议2~3。比如京东1次。
backup 表示热备配置,备用服务器。当负载均衡算法为ip_hash时,后端服务器在负载均衡中的状态不能是weight和backup。
fail_timeout=10s 在定义max_fails的失败次数后,距离下次检查的间隔时间,默认是10s。如果max_fails=5,就检查5次,如果5次都是502,那么等待10s再去检查一次,如果还是502,在不重新加载nginx配置的情况下,每隔10s再检查一次。常规业务设置为2~3秒。比如京东3秒。
down 标记这个服务器不可用。这参数配合ip_hash使用。
3、负载均衡调度算法
调度算法一般分为两类:
第一类:静态调度算法,即负载均衡器根据自身设置的规则进行分配,不需要考虑后端节点服务器的情况,例如:rr、wrr、ip_hash等算法都属于静态调度算法。
第二类:动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获得请求,响应时间短的优先获得请求。例如:least_conn、fair等都属于动态调度算法。
常见算法介绍:
(1)rr轮询(默认调度算法,静态调度算法) 按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器,相当于LVS中的rr算法,如果后端节点服务器宕机,宕机的服务器会被自动从节点服务器 池中剔除,以使客户端的用户访问不受影响。新的请求会分配给正常的服务器。
(2)wrr(权重轮询,静态调度算法)
在rr轮询算法的基础上加上权重,即为权重轮询算法。当使用该算法时,权重和用户访问成正比,权重值越大,被转发的请求也就越多。可以根据服务器的配置和性能指定权重值大小。
(3)ip_hash(ip哈希,静态调度算法)
每个请求按客户端IP的hash结果分配,当新的请求到达时,先将其客户端IP通过哈希算法算出一个值,在随后的客户端请求中,客户端IP的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页的session共享问题,但有时候会导致请求分配不均,即无法保证1:1的负载均衡。
(4)fair(动态调度算法) 该算法会根据后端节点服务器的响应时间来分配请求,响应时间短的优先分配。这是更加智能的调度算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。但nginx本身不支持fair算法,必须下载upstream_fair模块。
(5)least_conn
该算法会根据后端节点服务器的连接数来决定分配情况,哪个机子连接数少就分发。 (6)url_hash算法 与ip_hash算法类似,这里是根据访问URL的hash结果来分配请求,让每个URL定向到同一个后端服务器,后端服务器为缓存服务器时效果显著。nginx本身bu支持url_hash算法,必须下载相关包。
(7)一致性hash算法
一致性hash算法一般用于代理后端服务器业务为缓存服务(如squid、memcached)的场景,通过将用户请求的URL或指定字符串进行计算,然后调度到后端服务器上,此后任何用户查找同一个URL或指定字符串都会被调度到这一台服务器上,因此后端的每个节点缓存的内容都是不同的,一致性hash算法可以解决后端某个或某几个节点宕机后,缓存的数据动荡最小。
简单nginx负载均衡代码如下:
4、http_proxy_module模块
1、proxy_pass指令介绍
proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器。在实际的反向代理工作中,会通过location功能匹配指定的URL,然后把接收到的符合匹配URL的请求通过proxy_pass抛给定义好的upstream节点池。
例如:
2、http proxy模块参数
nginx的代理功能通过http proxy模块来实现。该模块相关参数:
proxy_set_header 设置http请求header项传给后端服务器节点,例如,可以实现让后端的服务器节点获取访问客户端用户的真实ip。
proxy_next_upstream 设置故障转移,语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...; 默认值: proxy_next_upstream error timeout;
client_body_buffer_size 用于指定客户端主题缓冲区大小。
proxy_connect_timeout 表示反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间。
proxy_send_timeout 表示代理后端服务器的数据回传时间,即在规定时间之内后端服务器必须传完所有的数据,否则,nginx将断开这个连接。
proxy_read_timeout 设置nginx从代理的后端服务器获取信息的时间,表示连接建立后,nginx等待后端服务器的响应时间,其实是nginx已经进入后端的排队之中等候处理的时间。
proxy_buffer_size 设置缓冲区大小,默认为proxy_buffers设置的大小。
proxy_buffers 设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放到缓冲区。
proxy_busy_buffers_size 用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_buffers*2
proxy_temp_file_write_size 指定proxy缓存临时文件的大小。
二、SSL
SSL证书可以到各大机构申请,现在基本都是收费的。当然也可以自己制作,自己制作的证书没有被浏览器厂商承认,所以只能自己测试用。
下面演示自己制作证书,配置SSL。
(1)生成私钥和公钥
1、生成一个私钥
假设网站目录是/htdocs/ssl
生成私钥需要设置密码,假设密码是:123456
生成的这个私钥是有密码的,现在要把这密码去掉:
输入密码123456后即可,此时的私钥pri.csr就没有密码了。
2、生成请求证书
用刚才的没有加密的私钥去生成请求证书。
反正是用来自己测试,所以上面的很多信息都没有填写。
3、生成公钥
用前面生成的没有密码的私钥(pri.key)和请求文件(pri.csr)去生成公钥
OK,完成。私钥是:pri.key,公钥是:public.crt。
(2)配置ssl
创建虚拟主机,假设配置文件为:ssl.conf,网站目录为:/htdocs/ssl/
/usr/local/nginx/conf/fastcgi_params文件中添加:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
(3)创建测试页
重启nginx服务和清空防火墙。
浏览器打开:https:192.168.10.205
提示不安全,因为是自己制作的证书。
点击高级--添加例外即可。
OK显示成功:
三、php_fpm之pool
每一个pool可以监听一个端口。默认的pool是[www] 比如自定义一个pool,名字为[haha]
保存退出,重新加载
查看一下进程:
OK,自定义的haha已启动。
四、php-fpm的慢执行日志
在[www]pool中添加以下两行内容
重启php-fpm
测试:
网站目录为:/htdocs/slow
虚拟主机配置文件:
清空防火墙,关闭selinux,重启nginx,php-fpm
使用curl命名测试:
查看日志:
日志显示/htdocs/slow/slow.php文件的第4行使用了sleep()
五、php-fpm之open_basedir
可以针对每个虚拟主机设置basedir,也可针对每个pool设置basedir。
测试:
把php_admin_value[open_basedir]改为/htdocs/test1:/tmp 重启php-fpm,再测试:
OK,正常。
六、php-fpm进程管理
配置解释:
扩展
针对请求的uri来代理 http://ask.apelearn.com/question/1049
根据访问的目录来区分后端的web http://ask.apelearn.com/question/920
nginx长连接 http://www.apelearn.com/bbs/thread-6545-1-1.html
nginx算法分析 http://blog.sina.com.cn/s/blog_72995dcc01016msi.html
nginx中的root和alias区别 http://blog.csdn.net/21aspnet/article/details/6583335
nginx的alias和root配置 http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/
http://www.iigrowing.cn/shi-yan-que-ren-nginx-root-alias-location-zhi-ling-shi-yong-fang-fa.html 这个更详细
ssl:https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ca.md