网上整理的关于Nginx 学习材料 2
一 Nginx 简单的负载均衡配置示例[原创](链接地址:http://zyan.cc/post/306/)www.zyan.cc 和 blog.zyan.cc 域名均指向 Nginx 所在的服务器I
一 Nginx 简单的负载均衡配置示例[原创]
(链接地址:http://zyan.cc/post/306/)
www.zyan.cc 和 blog.zyan.cc 域名均指向 Nginx 所在的服务器IP 。
用户访问http://www.zyan.cc,将其负载均衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。
用户访问http://blog.zyan.cc,将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。
以下为配置文件nginx.conf :(windows 中配置参数有点不同,测试过的) user www www;
worker_processes 10;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#最大文件描述符
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
{
include conf/mime.types;
default_type application/octet-stream;
keepalive_timeout 120;
tcp_nodelay on;
upstream www.zyan.cc {
1 / 93
,server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80;
server 192.168.1.5:80;
}
upstream blog.zyan.cc {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
}
server
{
listen 80;
server_name www.zyan.cc;
location / {
proxy_pass http://www.zyan.cc;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
log_format www_s135_com '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data1/logs/www.log www_s135_com;
}
server
{
listen 80;
server_name blog.zyan.cc;
location / {
2 / 93
,proxy_pass http://blog.zyan.cc;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
log_format blog_s135_com '$remote_addr - $remote_user [$time_local] $request ' '"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data1/logs/blog.log blog_s135_com;
}
}
附:Nginx 的安装方法可参照《Nginx 0.5.31 PHP 5.2.4(FastCGI )搭建可承受3万以上并发连接数,胜过Apache 10倍的Web 服务器》文章的以下段落(仅做负载均衡,无需支持PHP 的安装方法):
二、安装PHP 5.2.4(FastCGI 模式)
4、创建www 用户和组,以及其使用的目录:
三、安装Nginx 0.5.31
1、安装Nginx 所需的pcre 库:
2、安装Nginx
3、创建Nginx 日志目录
5、启动Nginx
问答:
1. 如果负载均衡后面的机器都是要用到session 的话,如何很好的解决这个问题呢?
2. 有没有类似的负载均衡功能? 另外还有一个疑问:
客户端直接访问web 服务器时,可以用HTTP_CLIENT_IP、REMOTE_ADDR 这几个变量看到客户端的IP ,经过squid 或者ngrnx 之后,还能看到客户端的IP 吗? 是不是要用HTTP_X_FORWARDED_FOR
—BIG-IP 就是用来做负载均衡的。经过squid 或者ngrnx 之后,看到客户端的IP ,请用HTTP_X_FORWARDED_FOR
3 / 93
,3.A. 如果均衡的域名中有泛域名,或有几百个域名的话可以配置吗?
B.ngnix 在做均衡的时候是否已经包含了cache 功能?
C.ngnix---squid----apache 取的的HTTP_X_FORWARDED_FOR是squid 服务器的ip 地址,如果想取真实客户端地址可以做到吗?
回复:(1)nginx.conf
server_name .s135.com; 即可支持***.s135.com泛域名
(2)nginx负载均衡只做反向代理,有简单的缓冲,但不像Squid 那样将cache 存在本机。
(3)我已经在nginx.conf 配置文件中增加:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
编译squid 时加上--enable-follow-x-forwarded-for
然后在squid.conf 中输入一行:
follow_x_forwarded_for allow all
后端的Apache 取日志(httpd.conf ):
LogFormat "{X-Forwarded-For}i l u t "r" >s b "{Referer}i" "{User-Agent}i" h T" combined
取到的就是用户真实IP
4. 这个软件是不错,但是有一个硬伤,做负载均衡时,好像无法检测节点健康状态?
5.follow_x_forwarded_for allow all 全开是不是会引起安全问题?
6. 请问,NGINX 是不是基于域名的负载均衡 能不能基于IP 做负载均衡
7. 请问:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
4 / 93
,请问这三个是什么意思啊?
8. 有请张兄指教:
server1与server2都安装web.
为了省下一台主机. 在server1上安装nginx, 做反向代理, 轮循到server1, server2的web 上实现负载均衡.
请问这样做与单独使用一台server3做负载均衡器的区别是不是非常大?
9. 我想问下,转发到后端那几台服务器,程序怎么同步?假如PHP 呢?做负载均衡时,好像无法检测节点健康状态?想问一下,为什么本机不能也接受访问呢? 例如:a 、b 、c 三台机器,我在a 上面如同上面配置的,为什么访问总是在b 、c 来回换,为什么a 上也有网站却不被访问到呢?如果我也想访问a 服务器上的网站需要如何处理?
10. 诚心请教,在php-fpm 模式下,
可以做一组
upstream blog.s135.com {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
}
负载均衡么?
我查阅了一些资料,好像php-fpm 同时只能打开一个端口,如果想实现可行么?
11. 诚心请教,在php-fpm 模式下,
可以做一组
upstream blog.s135.com {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
}
负载均衡么?
我查阅了一些资料,好像php-fpm 同时只能打开一个端口,如果想实现可行么?
12.include conf/mime.types;
5 / 93
,引用mime.types 文件的路劲前面应该不用加conf/,指定的类型文件应该自动会到conf 目录中去找
13. 请教一下,经过Nginx 转发后,是不是会转Http1.1损失为Http1.0?请教一下,经过Nginx 转发后,是不是会转Http1.1损失为Http1.0?
14. 安装php 必须要用fastcgi 模式吗?我用的是fpm 的,但发现做负载均衡的时候发现访问/message/目录下的php 文件的时候总是失效,系统自动在/下面去访问了,不知是什么原因的?
解答:解决了, 刚开始准备将负载均衡器也做为web 使用, 启用了以下代码 ,将这几行删除即可。
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; include fastcgi_params;
}
6 / 93
,二 nginx upstream的分配方式
(链接地址:http://onlyzq.blog.51cto.com/1228/557848/)
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down 掉,能自动剔除。
2、weight
指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:
upstream bakend {
server 192.168.159.10 weight=10;
server 192.168.159.11 weight=10;
}
3、ip_hash
每个请求按访问ip 的hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session 的问题。
例如:
upstream resinserver{
ip_hash;
server 192.168.159.10:8080;
server 192.168.159.11:8080;
}
4、fair (第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream resinserver{
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url 的hash 结果来分配请求,使每个url 定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream 中加入hash 语句,server 语句中不能写入weight 等其他的参数,hash_method是使用的hash 算法
upstream resinserver{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
7 / 93
,}
tips:
upstream resinserver{#定义负载均衡设备的Ip 及设备状态
ip_hash;
server 127.0.0.1:8000 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6801;
server 127.0.0.1:6802 backup;
}
在需要使用负载均衡的server 中增加
proxy_pass http://resinserver/;
每个设备的状态设置为:
1.down 表示单前的server 暂时不参与负载
2.weight 默认为1.weight 越大,负载的权重就越大。
3.max_fails :允许请求失败的次数默认为1. 当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup : 其它所有的非backup 机器down 或者忙的时候,请求backup 机器。所以这台机器压力会最轻。
nginx 支持同时设置多组的负载均衡,用来给不用的server 来使用。
client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
location 对URL 进行匹配. 可以进行重定向或者进行新的代理 负载均衡
8 / 93
,三 关于Nginx 的server_name
(链接地址:http://onlyzq.blog.51cto.com/1228/535279)
Nginx 中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为:
1、准确的server_name匹配,例如:
server {
listen 80;
server_name domain.com www.domain.com;
...
}
2、以*通配符开始的字符串:
server {
listen 80;
server_name *.domain.com;
...
}
3、以*通配符结束的字符串:
server {
listen 80;
server_name www.*;
...
}
4、匹配正则表达式:
server {
listen 80;
9 / 93
,server_name ~^(?. ).domain.com$;
...
}
nginx 将按照1,2,3,4的顺序对server name 进行匹配,只有有一项匹配以后就会停止搜索,所以我们在使用这个指令的时候一定要分清楚它的匹配顺序(类似于location 指令)。
server_name指令一项很实用的功能便是可以在使用正则表达式的捕获功能,这样可以尽量精简配置文件,毕竟太长的配置文件日常维护也很不方便。下面是2个具体的应用:
1、在一个server 块中配置多个站点:
server
{
listen 80;
server_name ~^(www.)?(. )$;
index index.php index.html;
root /data/wwwsite/$2;
}
站点的主目录应该类似于这样的结构:
/data/wwwsite/domain.com
/data/wwwsite/nginx.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com
这样就可以只使用一个server 块来完成多个站点的配置。
2、在一个server 块中为一个站点配置多个二级域名。
实际网站目录结构中我们通常会为站点的二级域名独立创建一个目录,同样我们
10 / 93