如果你对此篇文章感兴趣请先看前面一篇基础,有什么疑问和不懂可以讨论。欢迎提问!
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已经能够正常工作。