Cannot assign requested address

代码连接数据库报错:

根据提示是说无法分配请求地址,这个问题随便一搜就知道是端口不足造成的。
查了下系统网络连接状态,发现是连接redis造成,没有使用redis连接池,导致大量time_wait连接状态没及时释放。再加上其他服务连接造成端口不足。

# 先通过修改内核参数解决,临时生效

sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_recycle=1
# 增大可用源端口范围
sysctl -w net.ipv4.ip_local_port_range="10000 65000"

注意:
4.12内核版本开始移除了 tcp_tw_recycle 配置

lanmp环境 nginx反向代理加本地缓存

采用这个架构主要考虑到apache跑php应用相对nginx来言比较稳定,前端用nginx做反向代理,并实现缓存功能。

软件版本:
apr-1.5.1.tar.gz
apr-util-1.5.4.tar.gz
cmake-3.0.2.tar.gz
httpd-2.4.10.tar.gz
libiconv-1.14.tar.gz
mariadb-10.0.14.tar.gz
nginx-1.6.2.tar.gz
ngx_cache_purge-2.1.tar.gz
pcre-8.36.tar.gz
php-5.6.1.tar.gz

源码全部打包到博客中,下载地址:https://www.rootop.org/rs/lanmp.tar.gz

安装依赖rpm包:
[root@nginx-cache tar_gz]# yum -y install gcc gcc-c++ make automake autoconf kernel-devel ncurses-devel libxml2-devel openssl-devel curl-devel libjpeg-devel libpng-devel pcre-devel libtool-libs freetype-devel gd zlib-devel file bison patch mlocate flex diffutils readline-devel glibc-devel glib2-devel bzip2-devel gettext-devel libcap-devel libmcrypt-devel

解压所有的源码包,过程略。

安装apache2.4:

[root@nginx-cache httpd-2.4.10]# useradd -s /sbin/nologin apache #创建apache运行账户

以前2.2版本的apache需要先安装apr和apr-util,在2.4版本中只需要将apr和apr-util复制到apache源码包中的srclib目录下即可。
解压apr-1.5.1.tar.gz和apr-util-1.5.4.tar.gz,并改名为apr和apr-util,复制到apache源码包中的srclib目录下。

[root@nginx-cache httpd-2.4.10]# ./configure --prefix=/usr/local/apache --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared  --enable-headers=shared --enable-rewrite=shared --enable-static-support
[root@nginx-cache httpd-2.4.10]# make && make install

[root@nginx-cache httpd-2.4.10]# cp build/rpm/httpd.init /etc/init.d/httpd #复制启动脚本
[root@nginx-cache httpd-2.4.10]# chmod 755 /etc/init.d/httpd  #添加执行权限
[root@nginx-cache httpd-2.4.10]# ln -s /usr/local/apache/ /etc/httpd  #创建软连接适用启动脚本
[root@nginx-cache httpd-2.4.10]# ln -s /usr/local/apache/bin/httpd /usr/sbin/httpd
[root@nginx-cache httpd-2.4.10]# ln -s /usr/local/apache/bin/apachectl /usr/sbin/apachectl
[root@nginx-cache httpd-2.4.10]# ln -s /usr/local/apache/logs/ /var/log/httpd

修改主配置文件,运行账户和组改为apache:

[root@nginx-cache httpd-2.4.10]# vi /etc/httpd/conf/httpd.conf
User apache
Group apache

[root@nginx-cache httpd-2.4.10]# service httpd start
[root@nginx-cache httpd-2.4.10]# chkconfig httpd on

[root@nginx-cache httpd-2.4.10]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 16001 root 4u IPv6 184948 0t0 TCP *:http (LISTEN)
httpd 16003 apache 4u IPv6 184948 0t0 TCP *:http (LISTEN)
httpd 16004 apache 4u IPv6 184948 0t0 TCP *:http (LISTEN)
httpd 16005 apache 4u IPv6 184948 0t0 TCP *:http (LISTEN)
这里发现用service httpd stop会失败,暂未查原因,可以使用apachectl start/stop来管理服务状态。

安装mariadb:
安装mariadb之前需要先装cmake工具。用来生产mariadb编译信息。

[root@nginx-cache cmake-3.0.2]# ./configure && gmake && make install
[root@nginx-cache mariadb-10.0.14]# useradd -s /sbin/nologin mysql #添加mysql运行账户
[root@nginx-cache mariadb-10.0.14]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mariadb -DMYSQL_UNIX_ADDR=/tmp/mariadb.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_DATADIR=/usr/local/mariadb/data

[root@nginx-cache mariadb-10.0.14]# make  #这一步过程比较慢
[root@nginx-cache mariadb-10.0.14]# make install

初始化mysql:
[root@nginx-cache mariadb-10.0.14]# /usr/local/mariadb/scripts/mysql_install_db --basedir=/usr/local/mariadb/ --datadir=/usr/local/mariadb/data/ --user=mysql

修改my.cnf配置文件:

[mysqld]
datadir=/usr/local/mariadb/data/  #修改本行为 /usr/local/mariadb/data/
socket=/tmp/mariadb.sock #sock文件路径,跟编译参数一样
pid-file=/tmp/mariadb.pid #添加pid文件路径
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/tmp/mariadb.pid #pid文件路径

[root@nginx-cache mariadb-10.0.14]# service mysqld start
Starting MySQL SUCCESS!
[root@nginx-cache mariadb-10.0.14]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 10337 mysql 16u IPv6 273675 0t0 TCP *:mysql (LISTEN)

[root@nginx-cache mariadb-10.0.14]# chkconfig mysqld on

设置mariadb的root密码,此处密码也设置为root :
[root@nginx-cache mariadb-10.0.14]# /usr/local/mariadb/bin/mysql

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> update user set password=password('root') where user='root';
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4  Changed: 4  Warnings: 0

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> exit

安装php:

[root@nginx-cache php-5.6.1]# ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-openssl --with-zlib --enable-bcmath --with-bz2 --with-curl --enable-ftp --with-gd --enable-gd-native-ttf --with-gettext --with-mhash --enable-mbstring --with-mcrypt --enable-soap --enable-zip --with-iconv=/usr --with-mysql=/usr/local/mysql --without-pear --disable-fileinfo

这里遇到一个错误:
configure: error: Don’t know how to define struct flock on this system, set –enable-opcache=no
解决方法:
[root@nginx-cache php-5.6.1]# vi /etc/ld.so.conf.d/local.conf 添加:
/usr/local/lib
[root@nginx-cache php-5.6.1]# ldconfig #生效
重新configure。

[root@nginx-cache php-5.6.1]# make
[root@nginx-cache php-5.6.1]# make install

[root@nginx-cache php-5.6.1]# cp php.ini-production /etc/php.ini

添加apache对php文件解析映射:

[root@nginx-cache php-5.6.1]# vi /etc/httpd/conf/httpd.conf
Addtype application/x-httpd-php .php

重启apache。

添加phpinfo测试页,测试php是否正常打开:

[root@nginx-cache ~]# vi /etc/httpd/htdocs/p.php

<?php
phpinfo ();
?>

通过浏览器访问:http://42.62.73.xxx/p.php

看是否出现phpinfo信息,如果没有回头检查。至此lamp完成了。

配置nginx:
现在要让nginx反向代理apache,并实现nginx本地缓存。

先安装pcre:

[root@nginx-cache pcre-8.36]# ./configure && make && make install

安装nginx,在这里添加第三方模块ngx_cache_purge,因为nginx用作本地缓存,加上这个模块方便清除缓存。从https://github.com/FRiCKLE/ngx_cache_purge/releases下载。

[root@nginx-cache pcre-8.36]# useradd -s /sbin/nologin www
[root@nginx-cache nginx-1.6.2]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --add-module=../ngx_cache_purge-2.1
[root@nginx-cache nginx-1.6.2]# make && make install

添加nginx启动脚本:
[root@nginx-cache ~]# vi /etc/init.d/nginx

#! /bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/$NAME.conf
PIDFILE=/usr/local/nginx/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

set -e
[ -x "$DAEMON" ] || exit 0

do_start() {
 $DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}

do_stop() {
 kill -INT `cat $PIDFILE` || echo -n "nginx not running"
}

do_reload() {
 kill -HUP `cat $PIDFILE` || echo -n "nginx can't reload"
}

case "$1" in
 start)
 echo -n "Starting $DESC: $NAME"
 do_start
 echo "."
 ;;
 stop)
 echo -n "Stopping $DESC: $NAME"
 do_stop
 echo "."
 ;;
 reload|graceful)
 echo -n "Reloading $DESC configuration..."
 do_reload
 echo "."
 ;;
 restart)
 echo -n "Restarting $DESC: $NAME"
 do_stop
 do_start
 echo "."
 ;;
 *)
 echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
 exit 3
 ;;
esac

exit 0

[root@nginx-cache ~]# chmod 755 /etc/init.d/nginx

现在把apache的监听端口改为8080,让nginx使用80端口。
[root@nginx-cache ~]# vi /etc/httpd/conf/httpd.conf
Listen 8080
重启apache。

配置反向代理:

[root@nginx-cache conf]# grep -v "#" nginx.conf | grep -v "^$"

user  www www;
worker_processes  10;
worker_rlimit_nofile 51200;

events
        {
                use epoll;
                worker_connections 51200;
        }

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

	upstream apache {
		server 127.0.0.1:8080 max_fails=3 fail_timeout=20s;
	}

	proxy_temp_path /home/temp_dir;
	proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=5g;

	include vhost/*.conf;
}

主要定义下面两行,设置缓存临时目录和缓存路径,需要在同一个分区下。

缓存区为cache_one占用内存200M,缓存1天,占用硬盘5G。

proxy_temp_path /home/temp_dir;
proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=5g;

虚拟主机配置:

[root@nginx-cache conf]# grep -v "#" vhost/blog.conf | grep -v "^$"
server {
 listen 80;
 server_name www.qdsop.com;
 index index.php index.html;
 error_log  /var/log/nginx_error.log  crit;

if ($request_method = "PURGE")
{
rewrite ^(.*)$ /purge$1 last;
}

location ~ /purge(/.*)
{
allow  all;
proxy_cache_purge  cache_one $host$1$is_args$args;
        }

location / {
 proxy_pass http://apache;
 proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
 proxy_redirect off;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 client_body_buffer_size 128k;
 proxy_connect_timeout 90;
 proxy_send_timeout 90;
 proxy_read_timeout 90;
 proxy_buffer_size 4k;
 proxy_buffers 4 32k;
 proxy_busy_buffers_size 64k;
 proxy_temp_file_write_size 64k;
 	}

location ~ .*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {
 proxy_pass http://apache;
 proxy_cache cache_one;
 proxy_cache_valid 200 302 1h;
 proxy_cache_valid 301 1d;
 proxy_cache_valid any 1m;
 proxy_cache_key $host$uri$is_args$args;
 add_header Cache "$upstream_cache_status";
 error_log /var/log/image_error.log debug;
 	}

location /status {
 stub_status on;
 access_log  off;
                  }
}

虚拟主机配置文件主要注意下面红色部分一定要在缓存配置内容之上,否则可能会出现清空缓存时404错误。

if ($request_method = “PURGE”)
{
rewrite ^(.*)$ /purge$1 last;
}

location ~ /purge(/.*)
{
allow all;
proxy_cache_purge cache_one $host$1$is_args$args;
}

现在可以通过访问nginx实现反向代理apache。
查看命中状态,现在访问一个特定的静态页面。比如图片:

第一次访问图片的时候,可以看到状态为:“未命中”

刷新浏览器查看响应头。

第二次为命中状态,说明nginx缓存起到作用。

现在测试清空缓存:

添加了ngx_cache_purge以后可以在原有的url上加上purge,实现清空缓存,比如:

http://www.xxx.com/purge/wp-content/uploads/2014/10/psb1.jpg

这样nginx反向代理apache配置完成,拓展一下,在本文基础上可以实现多台web进行负载均衡,nginx独立为一台服务器,通过本地缓存可以降低后端服务器压力,静态页面都由nginx处理,这样可以提高整体的并发。在这里测试的时候,装了一个WordPress环境进行测试,并配置了WordPress的伪静态功能,效果还可以,将服务器配置提高为16vcpu+32G内存,30M带宽。通过webbench压力测并发1W持续2分钟,通过nginx的status监测在3000左右,出口流量最高达到5M,不确定云计算平台网络流量监控是否准确,至此,过程全部结束!

提供一个通过web方式清空缓存的php程序,直接访问即可。然后输入要清空的缓存url路径。下载地址:https://www.rootop.org/rs/ngx_cache_purge.tar.gz

PS:
在安装php时,到make的时候遇到一个错误:
cc: Internal error: Killed (program cc1)
Please submit a full bug report.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1
这个原因是内存不足(512内存),我用的是云服务器,没有交换分区。导致出错,可以通过加参数 –disable-fileinfo 解决。

配置nginx出现的一个错误:Starting nginx: nginx: [emerg] the size 209715200 of shared memory zone “cache_one” conflicts with already declared size 0 in /etc/nginx/nginx.conf:50

注意配置段中的区域包含关系. proxycachepatch 要在proxy_cache前已经定义.

what seems to be the problem?
[emerg]: the size 52428800 of shared memory zone “media” conflicts with already declared size 0 in /etc/nginx/conf.d/cache.conf:5 configuration file /etc/nginx/nginx.conf test failed
This may be caused if “proxycache media” is included before proxycache_path.

lnmp源码编译过程

主要安装包:(自行下载)
目前全部软件的最新版本:
mysql-5.6.16.tar.gz
nginx-1.4.5.tar.gz
php-5.5.9.tar.gz

系统环境:centos6.5 x64
附加包:(自行下载)
cmake-2.8.10.2.tar.gz
bison-2.5.tar.gz
pcre-8.12.tar.gz

1、安装mysql:

首先安装cmake和bison:

[root@localhost smb]# tar zxvf cmake-2.8.10.2.tar.gz
[root@localhost smb]# cd cmake-2.8.10.2
[root@localhost cmake-2.8.10.2]# ./configure
[root@localhost cmake-2.8.10.2]# gmake
[root@localhost cmake-2.8.10.2]# make install

[root@localhost smb]# tar zxvf bison-2.5.tar.gz
[root@localhost smb]# cd bison-2.5
[root@localhost bison-2.5]# ./configure
[root@localhost bison-2.5]# make
[root@localhost bison-2.5]# make install

[root@localhost ~]# cd mysql-5.6.16
[root@localhost mysql-5.6.16]# useradd mysql -s /sbin/nologin

[root@localhost mysql-5.6.16]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql\
> -DMYSQL_UNIX_ADDR=/tmp/mysql.sock\
> -DDEFAULT_CHARSET=utf8\
> -DDEFAULT_COLLATION=utf8_general_ci\
> -DWITH_EXTRA_CHARSETS=all\
> -DWITH_INNOBASE_STORAGE_ENGINE=1\
> -DWITH_MYISAM_STORAGE_ENGINE=1\
> -DWITH_MEMORY_STORAGE_ENGINE=1\
> -DWITH_READLINE=1\
> -DENABLED_LOCAL_INFILE=1\
> -DMYSQL_DATADIR=/usr/local/mysql/data\
> -DMYSQL_USER=mysql\
> -DMYSQL_TCP_PORT=3306

(前面的大于号不是手动敲上去的,是在每一句参数后面有个斜杠\,回车以后自动生成,完整的参数如下:

 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_USER=mysql

不要误认为大于号是编译参数)

[root@localhost mysql-5.6.16]# make && make install
[root@localhost mysql-5.6.16]# cp support-files/my-default.cnf /etc/my.cnf
(打开配置文件发现基本没参数,不知道高版本为何这样?还是我编译的问题?)
[root@localhost mysql-5.6.16]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql-5.6.16]# chmod 755 /etc/init.d/mysqld

以上主要是添加启动脚本,添加 权限,方便用service + 服务名管理。

[root@localhost ~]# chown -R root.mysql /usr/local/mysql/
[root@localhost ~]# chown -R mysql /usr/local/mysql/data/


[root@localhost ~]# /usr/local/mysql/scripts/mysql_install_db --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --user=mysql

[root@localhost ~]# service mysqld start
Starting MySQL.. [确定]

初始化mysql,mysql编译完成。

2、安装nginx:

首先安装pcre:

 [root@localhost smb]# tar zxvf pcre-8.12.tar.gz
 [root@localhost smb]# cd pcre-8.12
 [root@localhost pcre-8.12]# ./configure
 [root@localhost pcre-8.12]# make
 [root@localhost pcre-8.12]# make install
 [root@localhost pcre-8.12]# cd
 [root@localhost ~]# cd nginx-1.4.5
 [root@localhost nginx-1.4.5]# useradd www -s /sbin/nologin
 [root@localhost nginx-1.4.5]# yum install -y openssl-devel
 [root@localhost nginx-1.4.5]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
 [root@localhost nginx-1.4.5]# make && make install

添加启动脚本:
[root@localhost ~]# vi /etc/init.d/nginx

这个脚本从一键lnmp安装脚本中获取,写的不错。

#! /bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/$NAME.conf
PIDFILE=/usr/local/nginx/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

set -e
[ -x "$DAEMON" ] || exit 0

do_start() {
 $DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}

do_stop() {
 kill -INT `cat $PIDFILE` || echo -n "nginx not running"
}

do_reload() {
 kill -HUP `cat $PIDFILE` || echo -n "nginx can't reload"
}

case "$1" in
 start)
 echo -n "Starting $DESC: $NAME"
 do_start
 echo "."
 ;;
 stop)
 echo -n "Stopping $DESC: $NAME"
 do_stop
 echo "."
 ;;
 reload|graceful)
 echo -n "Reloading $DESC configuration..."
 do_reload
 echo "."
 ;;
 restart)
 echo -n "Restarting $DESC: $NAME"
 do_stop
 do_start
 echo "."
 ;;
 *)
 echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
 exit 3
 ;;
esac

exit 0

[root@localhost ~]# chmod 755 /etc/init.d/nginx
[root@localhost ~]# service nginx start
Starting nginx daemon: nginx.
[root@localhost ~]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 12351 root 6u IPv4 1197244 0t0 TCP *:http (LISTEN)
nginx 12352 www 6u IPv4 1197244 0t0 TCP *:http (LISTEN)

3、安装php:

先安装一些所需的库文件
[root@localhost ~]# yum install -y libxml2-devel libcurl-devel libjpeg-devel libpng-devel freetype-devel
安装 mhash-0.9.9.9 libmcrypt-2.5.8 mcrypt-2.6.8,直接./configure make make install即可,过程略过。

[root@localhost php-5.5.9]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --disable-fileinfo

[root@localhost php-5.5.9]# make && make install
模块被安装在/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/下。

[root@localhost php-5.5.9]# mkdir -p /usr/local/php/etc
[root@localhost php-5.5.9]# cp php.ini-production /usr/local/php/etc/php.ini //复制配置文件
[root@localhost php-5.5.9]# ln -s /usr/local/php/etc/php.ini /etc/php.ini //方便编辑

[root@localhost ~]# cd /usr/local/php/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf

pid = run/php-fpm.pid
user = www
group = www
listen = 127.0.0.1:9000

主要定义上面三行参数

拷贝启动文件,设置开机启动。
[root@localhost etc]# cd
[root@localhost ~]# cd tar_gz/php-5.5.9
[root@localhost php-5.5.9]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-5.5.9]# chmod 755 /etc/init.d/php-fpm
[root@localhost php-5.5.9]# chkconfig php-fpm on

启动php-fpm:
[root@localhost php-5.5.9]# service php-fpm start
Starting php-fpm done
[root@localhost php-5.5.9]# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 3046 root 7u IPv4 267783 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 3047 www 0u IPv4 267783 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 3048 www 0u IPv4 267783 0t0 TCP localhost:cslistener (LISTEN)

4、测试:

配置nginx,支持php,并添加测试页面测试。
[root@localhost php-5.5.9]# vi /usr/local/nginx/conf/nginx.conf
在最后一个大括号上面添加一行:

include vhost_*.conf

因为一般情况下不再去修改主配置文件,通过include参数,在启动nginx的时候根据定义值去加载vhost开头的配置文件。
[root@localhost ~]# vi /usr/local/nginx/conf/vhost_rootop.conf

server
 {
 listen 80;
 server_name 192.168.1.105;
 index index.html index.htm index.php;
 root /mnt/data/web/rootop/;

 location ~ .*\.(php|php5)?$
 {
 try_files $uri =404;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 include fastcgi.conf;
 }

 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
 expires 30d;
 }

 location ~ .*\.(js|css)?$
 {
 expires 12h;
 }

 access_log off;
 }

重启nginx,写一个phpinfo测试页测试。

web集群中session同步问题

早在2011年做过2台机器的负载均衡,多台服务器中,实现用户的会话保持,不得不考虑session同步的问题。在这里提供了5种方法供参考:

一、数据库:

1、拿出来单独一台机器做session数据库。或在现有数据库中创建表存放session(加重数据库负担)

2、同步session文件夹到另外其它服务器中(或共享,如NFS服务)

二、cookie:

1、将session信息写入到cookie中,存放于客户端。

这种方式优点是简单,无额外开销,缺点是如果客户端禁用cookie将无法正常使用,安全性也很低。cookie可以伪造。

三、memcache:

memcache是一个高性能的分布式的内存对象缓存系统,可以将session写入到memcache中。

优点是存放在内存,速度快,比cookie方式安全,缺点是容易产生内存碎片,内存溢出,单点故障。

可考虑做memcache高可用。

四、专业的负载均衡器 比如深信服应用交付系统。

五、中间件技术。如weblogic等