Nginx 简单的负载均衡配置示例[转]

www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP。

用户访问http://www.s135.com,将其负载均衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。

用户访问http://blog.s135.com,将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。

以下为配置文件nginx.conf:

引用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;
}

http
{
include conf/mime.types;
default_type application/octet-stream;

keepalive_timeout 120;

tcp_nodelay on;

upstream www.s135.com {
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.s135.com {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
}

server
{
listen 80;
server_name

location / {
proxy_pass
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.s135.com;

location / {
proxy_pass
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

使用php-fpm来平滑变更FastCGI模式下的php设置

在使用FastCGI方式运行php的时候,如果我们改变了php.ini的设置,就得重新启动php的fastcgi守护程序。如果你的系统负载 比较大的话,这个重启过程或许会让你的系统中断服务一段时间。php-fpm就是为了解决这个问题而诞生的,它可以在php的fastcgi进程不中断的 情况下重新加载你改动过的php.ini。
而且php-fpm可以不用再依赖其它的fastcgi启动器,比如lighttpd的spawn-fcgi,对于我来说终于可以摆脱lighttpd的影子了。

还等什么,开始吧!

我的php版本是5.2.6,先到官网下载与php版本对应的php-fpm补丁:PHP-FPM

假设:php源代码目录在:/usr/local/src/php-5.2.6,php-fpm下载到了/usr/local/src

  1. cd /usr/local/src
  2. gzip -cd php-5.2.6-fpm-0.5.9.diff.gz | patch -d php-5.2.6 -p1

补丁打好以后,编译php的时候增加了下面几个参数:

–enable-fpm 激活fastcgi模式的fpm支持
–with-fpm-conf php-fpm的配置文件(默认是PREFIX/etc/php-fpm.conf)
–with-fpm-log php-fpm的日志文件(默认是PREFIX/logs/php-fpm.log)
–with-fpm-pid php-fpm的pid文件(默认是PREFIX/logs/php-fpm.pid)

编译的时候–enable-fpm当然是必须的,其它几项可以根据你自己的情况自行调整。
编译参数:

  1. cd /usr/local/src/php-5.2.6
  2. ./configure –enable-fastcgi –enable-fpm –prefix=/usr/local/php5 –with-config-file-path=/usr/local/php5/etc –THE-OTHERS
  3. make
  4. make install

其中–THE-OTHERS代表了其它的一些php编译参数,这里就略去了。

稍等片刻,等php编译并安装好,下面开始配置php-fpm。

  1. vi /usr/local/php5/etc/php-fpm.conf

php-fpm.conf是一个xml格式的纯文本文件,具体细节可以自己打开看看,基本上一看就明白了。在这里特别注意一下这几个配置字段:

  1. <value name="listen_address">127.0.0.1:9000</value>

这个表示php的fastcgi进程监听的ip地址以及端口

  1. <value name="user">nobody</value>
  2. <value name="group">nobody</value>

表示php的fastcgi进程以什么用户以及用户组来运行

  1. <value name="display_errors">0</value>

是否显示php错误信息

  1. <value name="max_children">5</value>

最大的子进程数目

下面运行php-fpm:

  1. /usr/local/php5/bin/php-cgi –fpm

现在php的fastcgi进程就已经在后台运行,并监听127.0.0.1的9000端口。
可以用ps和netstat来看看结果:

  1. ps aux | grep php-cgi
  1. netstat -tpl | grep php-cgi

安装好了php-fpm,那么它是怎么来达到我们最初的目的的呢?
很幸运,php-fpm自己就给我们准备了一个程序来控制fastcgi进程,这个文件在$PREFIX/sbin/php-fpm

运行一下:

  1. /usr/local/php5/sbin/php-fpm

该程序有如下参数:

start 启动php的fastcgi进程
stop 强制终止php的fastcgi进程
quit 平滑终止php的fastcgi进程
restart 重启php的fastcgi进程
reload 重新加载php的php.ini
logrotate 重新启用log文件

也就是说,在修改了php.ini之后,我们可以使用

  1. /usr/local/php5/sbin/php-fpm reload

这样,就保持了在php的fastcgi进程持续运行的状态下,又重新加载了php.ini。

后话:这个文件可以稍作修改,让它成为CentOS/Redhat的服务,减少一些管理上的开销。