Nginx+Apache有效提高服务器负载能力-LNAMP

之前流行过一段时间的Nginx+以fastCGI方式运行的PHP来搭建Web站点的方法。但是经过一段时间考量之后,大家经常发现会出现一些502的错误。其实一般是Nginx+fastCGIPHP的形式不太稳定造成。于是尝试了牛人推荐的一种是用Nginx做前端转发PHP请求给Apache的方法来进行服务器平台建设。这种方法有效的避免了Apache在应付大并发时候的些许不足和Nginx配合fastCGIPHP不太稳定的弊端。同时又在一定程度上利用了Nginx速度上的优势。说白了就是一些静态文件有Nginx来处理,PHP请求转发给后端Apache来处理。但是在效率上或者内存等资源占用上不如Nginx+fastCGI方式。

在PHP页面处理使用了suPHP,关于suPHP各位可以参照这里。suPHP其实现在被应用在很多空间租用商的服务器上。主要功能为了使用目录所有者的权限来执行特定位置的PHP页面,不是使用Apache默认Apache或者wwwdata或者nobody用户。

这样的好处主要有两点:
1.空间租用者(使用者)不需要在设置复杂权限了,在自己空间中PHP拥有完全权限。
2.空间租用者(使用者)存放网站文件的目录更安全,不需要开启Apache,wwwdate或者nobody之类权限对于自己站点,避免了777这样的高危权限。但是suPHP要求在编译安装PHP的时候必须编译为PHP-CGI形式才能是用,也就是不能使用平时我们所使用的CLI启动方式。

简单原理如下: CLI传统模式的图解:PHP是作为Apache一个模块存在,就像Apache的一个功能一样。

Apache_Mod-PHP-CLI

suPHP模式图解:suPHP作为Apache一个模块,在需要的时候以特定用户权限来启动PHP-CGI,从而实现以目录所有者权限执行PHP的功能。

Apache_Mod-suPHP_PHP-CGI

最终原理图大致如下:由Nginx接受全部目的端口为80的Web请求,根据请求内容的不同进行过滤。静态文件例如:MP3、GIF、JPG、JS等文件 由Nginx处理,其他PHP Web请求转发到后端Apache服务器上。Apache服务器利用suPHP模块按照目录所有者权限运行PHP程序从而返回页面给客户端。稍加改动就可 以实现跨越多台计算机的群集功能。

我们操作系统平台为CentOS5.5,姑且称呼他为:Nginx+Apache+MySQL+suPHP
Nginx-Apache-MySQL-suPHP

一、升级系统安装必须软件

yum update
yum install gcc gcc-c++ bison patch unzip mlocate flex wget automake \
autoconf gd cpp gettext readline-devel libjpeg libjpeg-devel libpng \
libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib \
zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel \
ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \
libidn libidn-devel openldap openldap-devel openldap-clients \
openldap-servers nss_ldap expat-devel libtool libtool-ltdl-devel \
kernel-devel autoconf213 vim-common vim-enhanced diff*

继续阅读“Nginx+Apache有效提高服务器负载能力-LNAMP”

博客顺利转入laird提供的空间

博客成功转入laird提供的空间,小弟是十分的感激啊。还有教我学perl。嗯这个必须要学会!
转到这个空间还有遇到点小问题的,就是wordpress不能上传文件和安装插件和主题,大部分原因是权限问题导致的。
而我转入的时候权限都设置好了,原因是nginx和php-cgi所运用的用户不一至。
改成统一的就OK了。

wordpress rewrite写法

        rewrite ^/wp-admin$ /wp-admin/ permanent;

        if (-f $request_filename/index.html){
                        rewrite (.*) $1/index.html break;
                }
        if (-f $request_filename/index.php){
                        rewrite (.*) $1/index.php;
                }
        if (!-f $request_filename){
                        rewrite (.*) /index.php;
                }
    }

nginx 301跳转到带www域名方法rewrite

首先一、得在你的域名管理里面定义 test.comwww.test.com指向你的主机ip地址,我们可以使用nslookup命令测试:
直接输入 nslookup test.com和nslookup www.test.com 都有指向ip的A记录即可。

第二、我们才能在nginx里面配置rewrite规则。
打开 nginx.conf文件找到你的server配置段:

server
{
listen 80;
server_name www.test.com test.com;
if ($host != 'www.test.com' ) {
    rewrite ^/(.*)$ http://www.test.com/$1 permanent;
}
........

这样就是用户直接访问test.com直接跳转的www.test.com。
即让不带www的域名跳转到带www的域名。

办法2:在配置文件里面写两个server,第一个里面把不带www的域名去掉

server
 {
  listen       80;
  server_name www.test.com;

在配置文件的最下面添加上,这样就可以了。

server {
                server_name test.com;
                rewrite ^(.*) http://www.test.com/$1 permanent;
        }

如果有多个不同的域名都绑定在同一个目录下不带3W的301到带3W的方法和上面的一样
在vhost的完整配制里后面加上

server {
server_name test1.com;
rewrite ^(.*) http://www.test1.com$1 permanent;
}

server {
server_name test2.com;
rewrite ^(.*) http://www.test2.com$1 permanent;
}

server {
server_name test3.com;
rewrite ^(.*) http://www.test3.com$1 permanent;
}

301永久跳转,当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息中的状态码的一种,表示本网页永久性转移到另一个地址。
302临时跳转,也是状态码的一种,意义是暂时转向到另外一个网址。
二者的区别主要是,一句话,302容易被搜索引擎视为spam,301则不会。
permanent代表301永久跳转,改为redirect则为302临时跳转。
nginx官方rewrite文档:传送门

默认的情况下,Nginx 在进行 rewrite 后都会自动添加上旧地址中的参数部分,而这对于重定向到的新地址来说可能是多余。
虽然这也不会对重定向的结果造成多少影响,但当你注意到新地址中包含有多余的“?xxx=xxx”时,心里总还是会觉得不爽,也可能会导致你的网站统计数据不准确。

例如:
把 http://example.com/test.php?para=xxx 重定向到 http://example.com/new

若按照默认的写法:
rewrite ^/test.php(.*) /new permanent;
重定向后的结果是:

http://example.com/new?para=xxx

如果改写成:
rewrite ^/test.php(.*) /new? permanent;
那结果就是:

http://example.com/new

所以,关键点就在于“?”这个尾缀。
假如又想保留某个特定的参数,那又该如何呢?可以利用Nginx本身就带有的$arg_PARAMETER参数来实现。

例如:
把 http://example.com/test.php?para=xxx&p=xx 重写向到 http://example.com/new?p=xx
可以写成:
rewrite ^/test.php /new?p=$arg_p? permanent;

总结如下:

rewrite  ^/test.php  /new  permanent;       //重写向带参数的地址
rewrite  ^/test.php  /new?  permanent;      //重定向后不带参数
rewrite  ^/test.php   /new?id=$arg_id?  permanent;    //重定向后带指定的参数

Nginx无缝升级

网站升级,如何升级 nginx 最新稳定版本?并且不停网站升级 nginx?

纪录一下从 nginx1.0.11 升级到 1.0.12,刚才在 VM 里测试升级到了 1.0.12 最新稳定版本。

具体做法如下:
一、首先查看当前版本:并下载目前最新 nginx 稳定版本:

[root@localhost ~]# nginx -v
nginx: nginx version: nginx/1.0.11

二、下载完毕开始解压编译:

编译环境:

yum install gcc openssl-devel pcre-devel zlib-devel

备份原来的 nginx 网站:

cp /usr/share/nginx /www/bakcup/nginx -r

即,备份目录可以自己指定。

tar zxvf nginx-1.0.12.tar.gz
cd nginx-1.0.12
./configure --prefix=/usr/share --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module
make

千万不要 make install

三、编译完后,我们开始操作升级。

mv /usr/sbin/nginx /usr/sbin/nginx0214
cp ./objs/nginx /usr/sbin/nginx
[root@localhost ~]# nginx -V
nginx: nginx version: nginx/1.0.12

重新加载 nginx

/usr/sbin/nginx -s reload

大功告成!!!

Nginx和PHP-FPM的启动/重启脚本

Nginx
这段时间在捣鼓服务器,Nginx和PHP都是源码编译安装的,每次都得打上长长的路径才能启动,或者在/etc/rc.local里写,启动的时候又看不到确定提示,所以不支持类似以前的nginx (start|restart|stop|reload)了。所以在网上找了这个脚本并且测试正常,在这里记录一下。博客有2个月没更新了,这算是2012年第一篇吧,哈哈,情人节快乐

一、Nginx启动脚本/etc/init.d/nginx

#!/bin/bash
#
#Startup script for Nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

编辑好后保存,执行以下命令

chmod +x /etc/init.d/nginx

现在把Nginx加入chkconfig,并设置开机启动。

chkconfig --add nginx
chkconfig nginx on

# 检查一下

chkconfig --list nginx

nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off

启动、停止、查看状态的命令如下:

service nginx start
service nginx stop
service nginx restart
service nginx reload

/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx restart
/etc/init.d/nginx reload

systemctl 脚本

cat /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/data/app/nginx/sbin/nginx -t -c /data/app/nginx/conf/nginx.conf
ExecStart=/data/app/nginx/sbin/nginx -c /data/app/nginx/conf/nginx.conf
ExecReload=/data/app/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true


[Install]
WantedBy=multi-user.target



systemctl enable nginx.service


现在可以使用下面的指令来控制nginx啦
systemctl start nginx.service
systemctl reload nginx.service
systemctl restart nginx.service
systemctl stop nginx.service

#日志
$ journalctl -f -u nginx.service

#下面这几个路径是你的nginx安装的目录,务必不要弄错。 
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf

二、PHP-FPM启动脚本/etc/init.d/php-fpm

从PHP 5.3.3开始就已经集成了PHP-FPM所以php-fpm在PHP 5.3.2以后的版本不支持以前的php-fpm (start|restart|stop|reload) 了,不用专门再打补丁了,只需要解开源码直接configure,关于php-fpm的编译参数有

--enable-fpm --with-fpm-user=www --with-fpm-group=www --with-libevent-dir=libevent位置

进入到php源代码目录下,然后:

cp -f (php -5.3.x-source-dir)/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

继续阅读“Nginx和PHP-FPM的启动/重启脚本”