如果你对此篇文章感兴趣请先看前面一篇基础,有什么疑问和不懂可以讨论。欢迎提问!

Nginx的高级应用

1、开启Nginx状态监控的功能:
[root@localhost ~]# cd /etc/nginx/
[root@localhost nginx]# vim nginx.conf

#在默认server段里添加下面的location段
location /nginx_status {
  stub_status on;
  access_log off;
}
[root@localhost nginx]# service nginx reload

使用浏览器查看是否操作成功

不能任何人都可以访问此状态信息,那么将如何限制呢?

2、做基于用户帐号的认证
由于要用到htpasswd命令所以要先装httpd 装载后不要启动
[root@localhost nginx]# yum -y install httpd
[root@localhost nginx]# htpasswd -c -m /etc/nginx/.htpasswd wei 
添加一个wei用户并输入密码
注意:htpasswd的-c选项只能在第一次时使用,否则会覆盖此前添加的用户
[root@localhost nginx]# htpasswd -m /etc/nginx/.htpasswd wang
添加wang用户的密码
[root@localhost nginx]# less /etc/nginx/.htpasswd    #查看添加的两个用户

[root@localhost nginx]# vim nginx.conf
在刚做监控功能的location段中添加下面的两行
location /nginx_status {
            stub_status on;
            access_log off;
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/.htpasswd;
        }

[root@localhost nginx]# service nginx reload

使用浏览器测试查看我们的操作是否成功

看到此页面输入用户名密码测试是否能登录


3、实现URL地址重写

设置一个简单的URL重写:
比如,上面我们做的实验中有个路径为/bbs/,但现在根据要求需要更改为/wang,于

是,就可以通过下面的方法实现:
[root@localhost nginx]# vim nginx.conf
#在默认server段中添加以下行
rewrite ^/bbs/?$ /wang/ permanent;
[root@localhost nginx]# service nginx reload
重启服务后使用浏览器测试看是否自动重写
last            临时跳转
redirect        下次处理
break           当遇到跳转后直接退出
permanent       永久跳转

1、if指令:
语法: if (condition) { ... }
应用环境: server, location

条件:

1、变量名; false values are: empty string ("", or any string starting 

with "0";)
2、对于变量进行的比较表达式,可使用=或!=进行测试;
3、正则表达式的模式匹配:
~  区分大小的模式匹配
~* 不区分字母大小写的模式匹配
!~ 和 !~* 分别对上面的两种测试取反
4、测试文件是否存在-f或!-f
5、测试目录是否存在-d或!-d
6、测试目录、文件或链接文件的存在性-e或!-e
7、检查一个文件的执行权限-x或!-x

在正则表达式中,可以使用圆括号标记匹配到的字符串,并可以分别使用$1,$2,...,

$9进行引用;

例如:
判断用户的浏览器类型:
if ($http_user_agent ~* MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}

if ($http_user_agent ~* opera) {
  rewrite  ^(.*)$  /opera/$1  break;
}

由于此处浏览器没有所以无法实验


实现域名跳转
server
{
listen 80;
server_name jump.magedu.com;
index index.html index.php;
root /www/htdocs;
rewrite ^/ http://www.wang.com/;
}

实现域名镜像
server
{
listen 80;
server_name mirror.magedu.com;
index index.html index.php;
root /www/htdocs;
rewrite ^/(.*)$ http://www.wang.com/$1 last;
}

简单的防盗链配置:
location ~* \.(gif|jpg|png|swf|flv)$ {
  valid_referers none blocked www.wang.com;
  if ($invalid_referer) {
    rewrite ^/ http://www.wang.com/403.html;
    # return 404
  }
}
第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行:www.wang.com
表示对www.wang.com这个来路进行判断if{}里面内容的意思是,如果来路不是指定来

路就跳转到错误页面,当然直接返回404也是可以的。

启用日志缓存
在http字段里添加以下行
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;

max 表示最大打开的文件数
inactive 表示文件打开多久没有被访问就移除
min_uses 表示在inactive的时间长度里被访问了多少次就被缓存
valid 表示检查缓存的文件是否还存在磁盘上


设定限速
1、为某个特定路径限速:
例:
location /downloads/ {
limit_rate 20k;
root /web/downloads/;
}
2、限制搜索引擎的bot(爬虫)速度
if ($http_user_agent ~ Google|Yahoo|MSN|baidu) {
limit_rate 20k;
}


设定反向代理:

简单示例:
location / {
  proxy_pass        http://192.168.2.10;
  proxy_set_header  Host  $host;
}

proxy_pass 指反向代理的服务器的地址
proxy_set_header 告诉后台服务器是谁访问它的

nginx和后端http服务器之间的连接是通过http/1.0协议进行的,因此,每连接是单

独建立的;但Nginx和客户端的browser之间的会话是基于http/1.1,因此可以实现

keep-alive的功能。此外,在响应用户之前,nginx把每一个用户的会话缓存至本地


自己在做web代理服务器的时候,自己就不能在做web服务器了.

其它常用指令:
proxy_buffers
proxy_buffers 32 4k; 表示有32个缓冲池每个缓冲池为4K

proxy_connect_timeout
proxy_connect_timeout 10; 表示连接超时的时间为10秒不能超出75秒

proxy_no_cache 表示对那些资源不进行缓存
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;


为反向代理启用缓存功能:

http {
    proxy_cache_path  /data/nginx/cache  levels=1:2  

keys_zone=STATIC:10m
                                         inactive=24h  max_size=1g;
    server {
        location / {
            proxy_pass             http://192.168.2.10; #反向代理的地址
            proxy_set_header       Host $host;
            proxy_cache            STATIC;
            proxy_cache_valid      200  1d; #对于某种对应码的缓存时间
            proxy_cache_use_stale  error timeout invalid_header updating
                                   http_500 http_502 http_503 http_504;
        }
    }
}


反向代理多台服务器实现负载均衡:

upstream backend {
server www1.wang.com weight=5;
server www2.wang.com max_fails=3 fail_timeout=30s;
server www3.wang.com;
}
server {
listen 80;
server_name example1.com;
access_log /var/log/magedu.com/access.log;
error_log /var/log/magedu.com/error.log debug;
#set your default location
location / {
include proxy.conf;
proxy_pass http://backend;
}
}


server
语法:server name [parameters]
其中的name可以是FQDN,主机地址,端口或unix套接字;如果FQDN解析的结

果为多个地址,则每个地址都会被用到;
weight = NUMBER - 设定权重,默认为1.
max_fails = NUMBER - 在fail_timeout指令设定的时间内发往此server的不成功的

请求次数,达到此数目后,此服务器将变为不可操作状态;默认值为1;设定为0值则

禁用此功能;
fail_timeout = TIME - 默认为10秒;
down  表示有服务器担不能使用
backup  表示当其它的服务器都不能使用时,才使用这个服务器

upstream
语法:upstream name { ... }
声明一组可以被proxy_pass和fastcgi_pass引用的服务器;这些服务器可以

使用不同的端口,并且也可以使用Unix Socket;也可以为服务器指定不同的权重;例

如:
    upstream backend {
    server backend1.wang.com weight=5;
    server 127.0.0.1:8080     max_fails=3  fail_timeout=30s;
    server unix:/tmp/backend3;
  }



memcached的编译安装

1、准备安装包
memcached-1.4.10.tar.gz

2、开始安装
[root@localhost ~]# tar xvf memcached-1.4.10.tar.gz
[root@localhost ~]# cd memcached-1.4.10
[root@localhost memcached-1.4.10]# ./configure
[root@localhost memcached-1.4.10]# make && make install
[root@localhost memcached-1.4.10]# vim /etc/init.d/memcached
#!/bin/bash
#
# Init file for memcached
#
# chkconfig: - 86 14
# description: Distributed memory caching daemon
#
# processname: memcached
# config: /etc/sysconfig/memcached

. /etc/rc.d/init.d/functions

## Default variables
PORT="11211"
USER="nobody"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

RETVAL=0
prog="/usr/local/bin/memcached"
desc="Distributed memory caching"
lockfile="/var/lock/subsys/memcached"

start() {
        echo -n $"Starting $desc (memcached): "
        daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE 

$OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $lockfile
        return $RETVAL
}

stop() {
        echo -n $"Shutting down $desc (memcached): "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $lockfile
        return $RETVAL
}

restart() {
        stop
        start
}

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

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  condrestart)
        [ -e $lockfile ] && restart
        RETVAL=$?
        ;;       
  reload)
        reload
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
   *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        RETVAL=1
esac

exit $RETVAL

[root@localhost memcached-1.4.10]# chmod +x /etc/init.d/memcached 
[root@localhost memcached-1.4.10]# chkconfig --add memcached
[root@localhost memcached-1.4.10]# service memcached start
Starting Distributed memory caching (memcached):           [  OK  ]
[root@localhost memcached-1.4.10]# netstat -tnlp

Nginx整合memcached:

在server段里添加location段

location / {
set $memcached_key $uri; #设置键值对
memcached_pass 127.0.0.1:11211; #缓存存放的地点
default_type text/html; #缓存那些类型的网页
error_page 404@fallback; #当缓存中没有响应的服务器
}
location @fallback {
proxy_pass http://192.168.2.1;
}

说明:此时的Nginx只做反向代理服务不提供web服务




为了给php提供加速,所以我们安装fastcgi,前提我们要安装以下几个软件包
libevent-1.4.14b-stable.tar.gz
libiconv-1.13.1.tar.gz #用于解释不用语言的库文件
libmcrypt-2.5.8.tar.gz #用于系统加密解密的库文件
mhash-0.9.9.9.tar.bz2 #用于计算hash码的库文件
mysql-5.5.19-linux2.6-i686.tar.gz
php-5.3.6.tar.bz2

说明:由于libevent在开始装Nginx的时候已经安装所以此处省略,按顺序安装

[root@localhost ~]#tar xvf libiconv-1.13.1.tar.gz 
[root@localhost ~]#cd libiconv-1.13.1
[root@localhost libiconv-1.13.1]#./configure
[root@localhost libiconv-1.13.1]# make && make install


[root@localhost ~]# tar xvf libmcrypt-2.5.8.tar.gz 
[root@localhost ~]# cd libmcrypt-2.5.8
[root@localhost libmcrypt-2.5.8]#./configure
[root@localhost libmcrypt-2.5.8]# make && make install
[root@localhost libmcrypt-2.5.8]# cd libltdl/
[root@localhost libltdl]# ./configure --with-gmetad --enable-gexec --

enable-ltdl-install
[root@localhost libltdl]#make && make install


[root@localhost ~]# tar xvf mhash-0.9.9.9.tar.bz2
[root@localhost ~]# cd mhash-0.9.9.9
[root@localhost mhash-0.9.9.9]# ./configure
[root@localhost mhash-0.9.9.9]# make && make install

把安装的软件库文件链接到系统的库文件目录中
[root@localhost mhash-0.9.9.9]# ln -sv /usr/local/lib/libmcrypt* 

/usr/lib
[root@localhost mhash-0.9.9.9]# ln -sv /usr/local/lib/libmhash.* 

/usr/lib/

[root@localhost ~]# tar xvf mysql-5.5.19-linux2.6-i686.tar.gz -C 

/usr/local/
[root@localhost ~]# groupadd -r -g 306 mysql
[root@localhost ~]# useradd -r -g mysql -u 306 -s /sbin/nologin -M mysql
[root@localhost ~]# id mysql
uid=306(mysql) gid=306(mysql) groups=306(mysql)
[root@localhost ~]# cd /usr/local
[root@localhost local]# ln -sv mysql-5.5.19-linux2.6-i686/ mysql
[root@localhost local]# cd mysql
[root@localhost mysql]# chown -R mysql:mysql .
[root@localhost mysql]# scripts/mysql_install_db --user=mysql
说明:默认把当前的data目录做为数据目录
[root@localhost mysql]# chown -R root .
[root@localhost mysql]# chown -R mysql data/
[root@localhost support-files]# cp my-large.cnf /etc/my.cnf
[root@localhost support-files]# cp mysql.server /etc/init.d/mysqld
[root@localhost support-files]# chkconfig --add mysqld
[root@localhost support-files]# vim /etc/my.cnf
#修改此参数
thread_concurrency = 2

[root@localhost support-files]# service mysqld start
Starting MySQL......                                       [  OK  ]
[root@localhost support-files]# vim /etc/ld.so.conf.d/mysqld.conf
/usr/local/mysql/lib
[root@localhost support-files]# ldconfig -v
[root@localhost support-files]# ln -sv /usr/local/mysql/include/ 

/usr/local/include/

[root@localhost support-files]# vim /etc/profile
#添加此行
PATH=$PATH:/usr/local/mysql/bin

[root@localhost support-files]# . /etc/profile
[root@localhost support-files]# mysql #测试是否能连接上

[root@localhost ~]# tar xvf php-5.3.6.tar.bz2
[root@localhost ~]# cd php-5.3.6
[root@localhost php-5.3.6]#./configure --prefix=/usr/local/php --with-

mysql=/usr/local/mysql --with-openssl --enable-fpm --with-

mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-

freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-

dir=/usr --enable-xml --with-iconv=/usr/local --with-mhash
[root@localhost php-5.3.6]# make ZEND_EXTRA_LIBS='-liconv'
[root@localhost php-5.3.6]# make install
[root@localhost php-5.3.6]# cp php.ini-production 

/usr/local/php/etc/php.ini

启动fastcgi:
[root@localhost php-5.3.6]# cp /usr/local/php/etc/php-fpm.conf.default 

/usr/local/php/etc/php-fpm.conf

[root@localhost php-5.3.6]# vim /usr/local/php/etc/php-fpm.conf
启用如下选项:
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35

[root@localhost php-5.3.6]#/usr/local/php/sbin/php-fpm


如果要以后开机启动编译/etc/rc.local文件添加以下行
/usr/local/php/sbin/php-fpm

[root@localhost php-5.3.6]# netstat -tnlp
查看是否有9000端口

[root@localhost php-5.3.6]# vim /etc/nginx/nginx.conf
修改默认网页的location段
location / {
            root  /web/html;
            index  index.html index.htm index.php;
        }

添加此location段
location ~ \.php$ {
            root          /web/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts

$fastcgi_script_name;
            include        fastcgi_params;
        }

[root@localhost nginx]# vim fastcgi_params
#删除文件里面的所有内容并添加如下行
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

[root@localhost nginx]# service nginx restart
[root@localhost nginx]# cd /web/html
[root@localhost html]# mv index.html index.php
[root@localhost html]# vim index.php
<?php
phpinfo();
?>

使用浏览器进行测试

安装PHP的memcache扩展
1、准备安装包memcache-2.2.5.tgz
2、安装
[root@localhost ~]# cp memcache-2.2.5.tgz /usr/local/src/
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# tar xf memcache-2.2.5.tgz 
[root@localhost src]# cd memcache-2.2.5
[root@localhost memcache-2.2.5]# /usr/local/php/bin/phpize #生成

configure脚本
[root@localhost memcache-2.2.5]# ./configure --with-php-

config=/usr/local/php/bin/php-config --enable-memcache
[root@localhost memcache-2.2.5]# make && make install

上述安装完后会有类似这样的提示:

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-

debug-non-zts-20090626/

编辑/usr/local/php/etc/php.ini,在“动态模块”相关的位置添加如下一行来载入

memcache扩展:
[root@localhost memcache-2.2.5]# vim /usr/local/php/etc/php.ini
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-

20090626/memcache.so

[root@localhost memcache-2.2.5]# killall php-fpm #关闭php-fpm
[root@localhost memcache-2.2.5]# /usr/local/php/sbin/php-fpm #重新启动
[root@localhost memcache-2.2.5]# netstat -tnlp
确保php-fpm的9000端口是处于监听状态

而后对memcached功能进行测试,在网站目录中建立测试页面test.php,添加如下内

容:

<?php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
$mem->set('mykey', 'Hello World', 0, 600);
$val = $mem->get('mykey');
echo "$val is from memcached.";         
?>

如果有输出“Hello World is from memcached.”,则表明memcache已经能够正常工作。