Nginx 简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Nginx 安装、调试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Nginx 安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1. 安装前注意事项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2. 安装前资源的准备 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3. 安装 Nginx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4. 验证安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5. Nginx 的常用参数和控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
6. 编写管理 Nginx 的脚步 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
7. 使用注意事项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Nginx 配置文件详解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Nginx 中的全局变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
通过例子学习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Nginx 监控 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Nginx Rewrite 基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Rewrite 基本标记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Rewrite 正则表达式匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Rewrite 条件判断 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Rewrite 应用实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
伪地址 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
域名跳转 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
附录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Nginx 编译模块名称解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Nginx 简介
Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器 ,Nginx ,它的发音为
“ engine X ” , 是一个高性能的 HTTP 和反向代理服务器,同时也是一个
IMAP/POP3/SMTP 代理服务器. Nginx 是由俄罗斯人 Igor Sysoev 为俄罗斯访问
量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。 Igor
Sysoev 在建立的项目时 , 使用基于 BSD 许可。
据说他当初是 F5 的成员之一,英文主页: http://nginx.net 。
俄罗斯的一些大网站已经使用它超过两年多了 , 一直表现不凡 , 相信想了解
nginx 的朋友都读过阿叶大哥的利用 nginx 实现负载均衡 . 直到 2007 年 4 月, 俄
罗 斯大约有 20% 左右的虚拟主机是由 nignx 服务或代理的。 Google 在线安全博
客中统计 nginx 服务或代理了大约所有 Internet 虚拟主机的 4% 。而 netcraft
的统计显示, nginx 服务的主机在过去的一年里以四倍的速度增长短短的几年
里, 它的排名已跃进第 9 。
( 参见: http://survey.netcraft.com/Reports/200707/ )
Nginx 以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常 高
效的反向代理、负载平衡。其拥有匹配 Lighttpd 的性能,同时还没有 Lighttp d
的内存泄漏问题,而且 Lighttpd 的 mod_proxy 也有一些问题并且很久没有更新 。
Nginx 并不支持 cgi 方式运行,原因是可以减少因此带来的一些程序上的 漏
洞。那么我们必须使用 FastCGI 方式来执行 PHP 程序。
现在, Igor 将源代码以类 BSD 许可证的形式发布。 Nginx 因为它的稳定性、
丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是
Apache2.2 + mod_proxy_balancer 的轻量级代替者,不仅是因为响应静态页面 的
速度非常快,而且它的模块数量达到 Apache 的近 2/3 。对 proxy 和 rewrite 模
块的支持很彻底,还支持 mod_fcgi 、 ssl 、 vhosts ,适合用来做 mongrel clus ters
的前端 HTTP 响应。
N ginx 做为 HTTP 服务器,有以下几项基本特性:
1. 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲 。
2. 无缓存的反向代理加速,简单的负载均衡和容错 。
3. FastCGI , 简单的负载均衡和容错 。
4. 模块化的结构。包括 gzipping, byte ranges, chunked responses 以及
SSI-filter 等 filter 。如果由 FastCGI 或其它代理服务器处理单页中 存
在的多个 SSI , 则这项处理可以并行运行,而不需要相互等待。
5. 支持 SSL 和 TLSSNI . 。 Nginx 专为性能优化而开发,性能是其最重要的考量 , 实现上非常注重效率 。
它支持内核 Poll 模型,能经受高负载的考验 , 有报告表明能支持高达 50,000 个
并发连接数。
Nginx 具有很高的稳定性。其它 HTTP 服务器,当遇到访问的峰值,或者有
人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去 响
应,只能重启服务器。例如当前 apache 一旦上到 200 个以上进程, web 响应速 度
就明显非常缓慢了。而 Nginx 采取了分阶段资源分配技术,使得它的 CPU 与内 存
占用率非常低。 nginx 官方表示保持 10,000 个没有活动的连接,它只占 2.5M 内 存 ,
所以类似 DOS 这样的攻击对 nginx 来说基本上是毫无用处的。就稳定性而
言 ,nginx 比 lighthttpd 更胜一筹。
Nginx 支持热部署。它的启动特别容易 , 并且几乎可以做到 7*24 不间断运
行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对 软
件版本进行进行升级。
Nginx 采用 master-slave 模型 , 能够充分利用 SMP 的优势,且能够减少工 作
进程在磁盘 I/O 的阻塞延迟。当采用 select()/poll() 调用时,还可以限制每 个
进程的连接数。
Nginx 代码质量非常高,代码很规范,手法成熟,模块扩展也很容易。特 别
值得一提的是强大的 Upstream 与 Filter 链。 Upstream 为诸如 reverse proxy ,
与其他服务器通信模块的编写奠定了很好的基础。而 Filter 链最酷的部分就是
各个 filter 不必等待前一个 filter 执行完毕。它可以把前一个 filter 的输出
做为当前 filter 的输入,这有点像 Unix 的管线。这意味着,一个模块可以开 始
压缩从后端服务器发送过来的请求,且可以在模块接收完后端服务器的整个请 求
之前把压缩流转向客户端。
Nginx 采用了一些 OS 提供的最新特性如对 sendfile (Linux2.2+) , accept -
filter (FreeBSD4.1+) , TCP_DEFER_ACCEPT (Linux 2.4+) 的支持,从而大大提
高了性能。
当然, nginx 还很年轻,多多少少存在一些问题,比如: Nginx 是俄罗斯人
创建,目前文档方面还不是很完善.因为文档大多是俄语,所以文档方面这也 是
个障碍.尽管 nignx 的模块比较多,但它们还不够完善。对脚本的支持力度不 够 。
这些问题, nginx 的作者和社区都在努力解决,我们有理由相信 nginx 将 继
续以高速的增长率来分享轻量级 HTTP 服务器市场,会有一个更美好的未来。
Nginx 安装、调试
Nginx 安装
1. 1. 1. 1. 安装前注意事项
1 ) 目前官方 Nginx 并不支持 Windows ,您只能在包括 Linux 、 UNIX 、 BS D
系统下安装和使用;
2 ) Nginx 本身只是一个 HTTP 和反向代理服务器,它无法像 Apache 一样
通过安装各种模块来支持不同的页面脚本,例如 PHP 、 CGI 等。
3 )为了确保能在 Nginx 中使用正则表达式进行更灵活的配置,安装之前 需
要确定系统是否安装有 PCRE ( Perl Compatible Regular Expressions )包 。
4) 需要安装在 2.6 以上内核版本的 GNU/Linux 系统中。
5) 编译前,请先确认 gcc 、 make 、 patch 等编译工具是否已安装,并可正常
使用。
2. 2. 2. 2. 安装前资源的准备
主要软件清单列表:
1 ) Nginx 安装文件
Nginx 0.6.32 nginx-0.6.32.tar.gz
( Nginx 官方站点为 http://www.nginx.net ,国内较好的中文站点为 http://www.nginx.cn )
2 ) Nginx URL 哈希模块
Upstream Hash Module nginx_upstream_hash-0.3.tar.gz
3 )正则表达式模块
PCRE 7.7 pcre-7.7.tar.gz
( 到 http://www.pcre.org 下载 PCRE 库的最新稳定版本 )
3. 3. 3. 3. 安装 Nginx (本安装环境是在 Rethad5 上,所有的安装文件和其他软件都在 /usr/local/src 上)
#cd /usr/local/src
#gunzip nginx-0.6.32.tar.gz
#gunzip nginx_upstream_hash-0.3.tar.gz
#gunzip pcre-7.7.tar.gz
#tar -xvf nginx-0.6.32.tar
#tar -xvf nginx_upstream_hash-0.3.tar
#tar -xvf pcre-7.7.tar
#cd nginx-0.6.32 (随后 patch 的运行必须要在该目录下)
#patch -p0 < /usr/local/src/nginx_upstream_hash-0.3/nginx.patch
4. 4. 4. 4. 验证安装
安装成功后 /usr/local/nginx 目录下有四个子目录分别是: conf 、 html 、 log s 、
sbin 。其中 Nginx 的配置文件存放于 conf/nginx.Conf ; Nginx 只有一个程
序文件位于 sbin 目录下的 nginx 文件。 如果你使用默认的配置文件,则要 确
保系统的 8 0 端口没被其他程序占用, 然后 运行 /usr/local/nginx/sbin/nginx 命 令
来启动 Nginx 。
可以通过以下两种方法测试 Nginx 是否成功启动
1. 打开浏览器访问此机器的 http:// IP : 端口( 80 可免输入) ,如果浏览器 出
现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。
2. 输入命令 netstat -nlp 如果能找到 Nginx 的端口那也代表你的 Nginx 成
功启动了。我的输出结果是:
tcp 0 0 0.0.0.0:82 0.0.0.0:* LISTEN 10209/nginx
5. 5. 5. 5. Nginx 的常用参数和控制
Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用 参
数和系统信号机制对 Nginx 进程本身进行控制的。
程序运行参数
-c <path_to_config> :使用指定的配置文件而不是 conf 目录下的 nginx.conf 。
-t :测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常 重
要,用来检测所修改的配置文件是否有语法错误。
-v :显示 nginx 版本号。
-V :显示 nginx 的版本号以及编译环境信息以及编译时的参数。
如果 要测试某个配置文件是否书写正确,可以使用以下命令
/usr/local/nginx/ sbin/nginx – t – c conf/nginx _my .conf
通过信号量对 Nginx 进行控制
有一个奇怪的现象不知道大家有没有注意到,就是你会发现只有启动 Nginx
#./configure --add-module=/usr/local/src/nginx_upstream_hash-0.3/ --with-
pcre=/usr/local/src/pcre-7.7/ --prefix=/usr/local/nginx --with-
http_stub_status_module --without-select_module --without-poll_module
( 模块的选择请参考附录 )
#make
#make install
的命令,但并没有关闭 Nginx 的命令。原因是 Nginx 是通过信号量来控制 Ngin x
的,包括重启 Nginx 、停止 Nginx 等。
Nginx 支持下表中的信号:
有两种方式来通过这些信号去控制 Nginx :
1 ) 通过 logs 目录下的 nginx.pid 查看当前运行的 Nginx 的进程 ID ,通过
kill – XXX <pid> 来控制 Nginx ,其中 XXX 可通
cat $Nginx_HOME/logs/nginx.pid 来查看 。
2 )如果您的系统中只有一个 Nginx 进程,那您也可以通过 killall 命令来完
成,例如运行 killall – s HUP nginx 来让 Nginx 重新加载配置。
6. 6. 6. 6. 编写管理 Nginx 的脚步
从上面的叙述可知道, Nginx 是通过信号量来控制的,所以管理起来是比 较
麻烦的,但我们可以通过书写相应的脚本来达到方便管理。(这样的管理脚本在
网上很多,大家也可以在网上查找)
步骤如下:
1 ) cd /usr/local/nginx
2 ) mkdir bin
3 ) vi nginx.sh
4 )内容是:
-------------------------------------------------------------------------------
#!/bin/sh
NGINX_HOME=/usr/local/nginx
NGINX_SBIN=$NGINX_HOME/sbin/nginx
NGINX_CONF=$NGINX_HOME/conf/nginx.conf
NGINX_PID=$NGINX_HOME/logs/nginx.pid
NGINX_MAXFD=65535
信号名 作用描述
TERM, INT 快速关闭程序,中止当前正在处理的请求
QUIT 处理完当前请求后,关闭程序
HUP 重新加载配置,并开启新的工作进程,关闭就的进
程,此操作不会中断请求
USR1 重新打开日志文件,用于切换日志,例如每天生成
一个新的日志文件
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程
NGINX_NAME="Nginx"
. /etc/rc.d/init.d/functions
if [ ! -f $NGINX_SBIN ]
then
echo "$NGINX_NAME startup: $NGINX_SBIN not exists! "
exit
fi
start() {
ulimit -HSn $NGINX_MAXFD
$NGINX_SBIN -c $NGINX_CONF
ret=$?
if [ $ret -eq 0 ]; then
action $"Starting $NGINX_NAME: " /bin/true
else
action $"Starting $NGINX_NAME: " /bin/false
fi
}
stop() {
kill `cat $NGINX_PID`
ret=$?
if [ $ret -eq 0 ]; then
action $"Stopping $NGINX_NAME: " /bin/true
else
action $"Stopping $NGINX_NAME: " /bin/false
fi
}
restart() {
stop
start
}
check() {
$NGINX_SBIN -c $NGINX_CONF -t
}
reload() {
kill -HUP `cat $NGINX_PID`
}
relog() {
kill -USR1 `cat $NGINX_PID`
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
check)
check
;;
reload)
reload
;;
relog)
relog
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|check|relog}"
exit 1
esac
---------------------------------------------------------------------------
5 ) chmod +x nginx.sh
6 ) 现在可以通过如下方式来控制 Nginx
/usr/local/nginx/bin/nginx.sh start 启动
/usr/local/nginx/bin/nginx.sh stop 关闭
/usr/local/nginx/bin/nginx.sh restart 重新启动,即先关闭后启动
/usr/local/nginx/bin/nginx.sh reload 重新装载配置文件
/usr/local/nginx/bin/nginx.sh check 检查配置文件
/usr/local/nginx/bin/nginx.sh relog 重新打开日志文件
7. 7. 7. 7. 使用注意事项
1 ) 在生产运行中,请注意 Nginx 的日志,定期进行日志文件的归档和截断。
A 将现有日志文件 备份 ;
B /usr/local/nginx/bin/nginx.sh relog
2 ) 当要求 reload (重新装载配置文件)时, N ginx 会对配置文件进行检查, 如
果配置文件有错,那么会继续使用旧的,已装载完毕的配置文件运行。为保
证生产系统的稳定运行,修改完配置文件后,必须进行 check 操作,以确保
配置文件的正确性。
3 ) 为保证生产系统的稳定运行, N ginx 与 php-cgi 的通讯端口请使用 tcp/ip
方式,而不使用 unix 套接字。虽然 tcp/ip 效率较低,但是相对稳定,而 且
可以将 php 运行在其他机器上。当 php 应用运行较慢,并发请求多的情况 下 ,
使用 unix 套接字容易导致连接失败,从而报告 502 错误( Bad Gateway )。
Nginx Nginx Nginx Nginx 配置文件详解 配置文件详解 配置文件详解 配置文件详解
接下来,观察 一个 Nginx 默认 的配置文件 并解析其中的含义
#user nobody; ----- 工作进程的属主
# worker_processes 1; ----- 工作进程数,一般与 CUP 的核数相同
# error_log logs/error.log; ----- 这三个是 Nginx 的错误日志
# error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid; -----Nginx pid 文件存放路径
events {
# use epoll; -----Nginx 的工作模式, Linux 下性能最好的 event 模式
worker_connections 1024; ----- 每个工作进程允许最大的同时连接数
}
-----http ,设定 http 服务器,利用它的反响代理功能,并可以利用它的负载 均
衡功能
http {
include mime.types; ----- 设定 mime 类型
default_type application/octet-stream;
------ 以下是设定日志格式
log_format main '$remote_addr - $remote_user [$time_local]
$request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main; ----- 日志文件名
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on; ----- 是否开启 gzip 功能
-----server 设定虚拟主机
server {
listen 8 0 ;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ .php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on
127.0.0.1:9000
#
#location ~ .php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based
configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers
ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
(文件配置内容在逐步更新)
从上面 Nginx 默认的配置我们可以知道,我们可以通过编写相应的模块达到我 们
想要的效果。
Nginx Nginx Nginx Nginx 中的全局变量
通过例子学习
小例子:
1. 禁止访问某个目录下的文件
location ~ ^/data {
deny all;
}
2. 禁止多个目录
location ~ ^/(cron|templates)/ {
deny all;
break;
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri
}
3. 禁止以 /data 开头的文件
location ~ ^/data {
deny all;
}
4. 禁止单个目录
不能禁止 .log.txt 能请求
location /searchword/cron/ {
deny all;
}
5. 禁止单个文件
location ~ /data/sql/data.sql {
deny all;
}
6. 只允许固定的 IP 访问并有密码
location / {
root /opt/htdocs/www;
allow Address;
allow Address;
allow Address;
deny all;
auth_basic "C1G_ADMIN";
auth_basic_user_file htpasswd;
}
7. 文件和目录不存在的时候重定向:
if (!-e $request_filename) {
proxy_pass http://127.0.0.1;
}
(注意: Nginx 不允许 if 嵌套操作)
案例一:
要求 :
1) 配置两个虚拟主机,分别为:
A www.my.com.cn 根连接为 /data/html/my, 端口为 80
B www.My_two.com.cn 根连接为 /data/html/my_two, 端口为 8080)
2) 针对两个域名把 gif,jpg 图片设置过期时间为 1 个月 3) 对 html 、 css 、 js 进行压缩
1,2 的实现
server {
listen 8 0 ;
server_name www.my.com.cn ;
charset gb2312 ;
access_log /data/my/ logs/host.access.log main;
location / {
root /data/html/my ;
index index.html index.htm;
}
location ~*.(gif|jpg)$ {
Expires 30d;
}
}
server {
listen 8 080 ;
server_name www.My_two.com.cn ;
charset gb2312 ;
#access_log logs/host.access.log main;
location / {
root /data/html/my_two ;
index index.html index.htm;
}
location ~*.(gif|jpg)$ {
Expires 30d;
}
}
3 的实现
在 http 里添加 :
gzip on;
gzip_types text/plain text/css text/html text/javascript
案例二
利用 Nginx 实现负载均衡,来自
http://dianping.blog.51cto.com/427241/95274/ http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] $request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log off;
access_log logs/access.log;# 日志文件名
sendfile on;
#tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
include gzip.conf;
# 集群中的所有后台服务器的配置信息
upstream tomcats {
server 192.168.0.11:8080 weight=10;
server 192.168.0.12:8081 weight=10;
server 192.168.0.13:8080 weight=10;
server 192.168.0.14:8081 weight=10;
server 192.168.0.15:8080 weight=10;
server 192.168.0.16:8081 weight=10;
}
server {
listen 80;#HTTP 的端口
server_name localhost;
charset utf-8;
#access_log logs/host.access.log main;
location ~ ^/NginxStatus/ {
stub_status on; #Nginx 状态监控配置
access_log off;
auth_basic "NginxStatus";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
location ~ ^/(WEB-INF)/ {
deny all;
}
location ~ .(htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js|
zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ {
root /opt/webapp;
expires 24h;
}
location / {
proxy_pass [url]http://tomcats;#[/url] 反向代理
include proxy.conf;
}
error_page 404 /html/404.html;
# redirect server error pages to the static page /50x.html
#
error_page 502 503 /html/502.html;
error_page 500 504 /50x.html;
location = /50x.html {
root html;
}
}
}
更具体地书写配置文件,在介绍完 rewrite 后会有更详细的介绍。
Nginx 监控要使用 Nginx 的监控功能必须有一个用户和密码,因此 我们必需生成一个
htppasswd 文件,这时候我们得用到 Apache 的 htpasswd 工具了。
生成 htppasswd 文件的方法:
#htpasswd -c /tmp/htpassswd user
输入两次密码就完成了,然后把生成好的 htpasswd 文件拷贝到 proxy 的机
器的 /usr/local/nginx/conf 目录下就行了。
有这个文件后,我们还要配置 conf 文件才能应用这一功能:
在根 {} 下书写以下模块
location ~^/NginxStatus{
stub_status on;
access_log on;
auth_basic "NginxStatus";
Auth_basic_user_file conf/htpasswd;
}
这个时候我们可以从浏览器中输入 http://ip/NginxStatus
输入验证账号后我们就可以看到相关的信息了,例如 ;
Active connection:10
Server accepts handled requests
9309 8982 28890
Reading:1 Writing:3 Waiting:6 Nginx Rewrite 基础
Rewrite 基本标记
last 相当于 Apache 里的 [L] 标记,表示完成 rewrite
break 终止匹配 , 不再匹配后面的规则
redirect 返回 302 临时重定向 地址栏会显示跳转后的地址
permanent 返回 301 永久重定向 地址栏会显示跳转后的地址
Rewrite Rewrite Rewrite Rewrite 正则表达式匹配
* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~ 和 !~* 分别为区分大小写不匹配及不区分大小写不匹配
Rewrite Rewrite Rewrite Rewrite 条件判断
-f 和 !-f 用来判断是否存在文件
-d 和 !-d 用来判断是否存在目录
-e 和 !-e 用来判断是否存在文件或目录
-x 和 !-x 用来判断文件是否可执行
Rewrite 应用实例 伪地址
/123456/xxxx -> /xxxx?id=123456
rewrite ^/(d+)/(.+)/ /$2?id=$1 last;
/[0-9]/my.html
rewrite
/(d+)/my.html /friend/my_list.jsp?uid=$1; break;
通过伪地址能提高你网站的安全性,这样暴露给用户的是一个假的地址。
域名跳转
简单域名跳转
server
{
listen 80;
server_name sky .com;
index index.html index.htm index.php;
root /opt/ sky /www;
rewrite ^/ http:// skybin090804.cublog .c n /;
access_log off;
}
多域名转向
server_name www.sky.com www.sky.net;
index index.html index.htm index.php;
root /data/sky;
if ($host ~ "sky.net") {
rewrite ^(.*) http://www.sky.com$1 permanent;
}
Nginx 相关知识在更新中 附录
Nginx Nginx Nginx Nginx 编译模块名称解析 编译模块名称解析 编译模块名称解析 编译模块名称解析
– prefix=PATH 设定安装目录
– sbin-path=PATH 设定程序文件目录
– conf-path=PATH 设定配置文件 (nginx.conf) 目录
– error-log-path=PATH 设定错误日志目录
– pid-path=PATH 设定 pid 文件 (nginx.pid) 目录
– lock-path=PATH 设定 lock 文件 (nginx.lock) 目录
– user=USER 设定程序运行的用户环境 (www)
– group=GROUP 设定程序运行的组环境 (www)
– builddir=DIR 设定程序编译目录
– with-rtsig_module 允许 rtsig 模块
– with-select_module 允许 select 模块 ( 一种轮询模式 , 不推荐用在高载环境 )
– without-select_module 不使用 select 模块
– with-poll_module 允许 poll 模块 ( 一种轮询模式 , 不推荐用在高载环境 )
– without-poll_module 不使用 poll 模块
– with-http_ssl_module 允许 ngx_http_ssl_module 模块 (Apache 对应 :mod_ssl)
– with-http_realip_module 允许 ngx_http_realip_module 模块 (mod_rpaf)
– with-http_addit ion_module 允许 ngx_http_addit ion_module 模块 (mod_layout)
– with-http_xslt_module 允许 ngx_http_xslt_module 模块
– with-http_sub_module 允许 ngx_http_sub_module 模块
– with-http_dav_module 允许 ngx_http_dav_module 模块 (mod_dav)
– with-http_flv_module 允许 ngx_http_flv_module 模块 (mod_flvx)
– with-http_gzip_stat ic_module 允许 ngx_http_gzip_static_module 模块 (mod_dflate)
– with-http_random_index_module 允许 ngx_http_random_index_module 模块 (mod_autoindex)
– with-http_stub_status_module 允许 ngx_http_stub_status_module 模块 (mod_status)
– without-http_charset_module 不使用 ngx_http_charset_module 模块
– without-http_gzip_module 不使用 ngx_http_gzip_module 模块
– without-http_ssi_module 不使用 ngx_http_ssi_module 模块
– without-http_userid_module 不使用 ngx_http_userid_module 模块
– without-http_access_module 不使用 ngx_http_access_module 模块
– without-http_auth_basic_module 不使用 ngx_http_auth_basic_module 模块
– without-http_autoindex_module 不使用 ngx_http_autoindex_module 模块
– without-http_geo_module 不使用 ngx_http_geo_module 模块
– without-http_map_module 不使用 ngx_http_map_module 模块
– without-http_referer_module 不使用 ngx_http_referer_module 模块
– without-http_rewrite_module 不使用 ngx_http_rewrite_module 模块
– without-http_proxy_module 不使用 ngx_http_proxy_module 模块
– without-http_fastcgi_module 不使用 ngx_http_fastcgi_module 模块
– without-http_memcached_module 不使用 ngx_http_memcached_module 模块
– without-http_limit_zone_module 不使用 ngx_http_limit_zone_module 模块
– without-http_empty_gif_module 不使用 ngx_http_empty_gif_module 模块
– without-http_browser_module 不使用 ngx_http_browser_module 模块
– without-http_upstream_ip_hash_module
不使用 ngx_http_upstream_ip_hash_module 模块
– with-http_perl_module 允许 ngx_http_perl_module 模块
– with-perl_modules_path=PATH 设置 perl 模块路径
– with-perl=PATH 设置 perl 库文件路径
– http-log-path=PATH 设置 access log 文件路径
– http-client-body-temp-path=PATH 设置客户端请求临时文件路径
– http-proxy-temp-path=PATH 设置 http proxy 临时文件路径
– http-fastcgi-temp-path=PATH 设置 http fastcgi 临时文件路径
– without-http 不使用 HTTP server 功能
– with-mail 允许 POP3/IMAP4/SMTP 代理模块
– with-mail_ssl_module 允许 ngx_mail_ssl_module 模块
– without-mail_pop3_module 不允许 ngx_mail_pop3_module 模块
– without-mail_imap_module 不允许 ngx_mail_imap_module 模块
– without-mail_smtp_module 不允许 ngx_mail_smtp_module 模块
– with-google_perftools_module 允许 ngx_google_perftools_module 模块 ( 调试用 )
– with-cpp_test_module 允许 ngx_cpp_test_module 模块
– add-module=PATH 允许使用外部模块 , 以及路径
– with-cc=PATH 设置 C 编译器路径
– with-cpp=PATH 设置 C 预处理路径
– with-cc-opt=OPTIONS 设置 C 编译器参数
– with-ld-opt=OPTIONS 设置连接文件参数
– with-cpu-opt=CPU 为指定 CPU 优化 , 可选参数有 :
pentium, pentiumpro, pentium3, pentium4,
athlon, opteron, sparc32, sparc64, ppc64
– without-pcre 不使用 pcre 库文件
– with-pcre=DIR 设定 PCRE 库路径
– with-pcre-opt=OPTIONS 设置 PCRE 运行参数
– with-md5=DIR 设定 md5 库文件路径
– with-md5-opt=OPTIONS 设置 md5 运行参数
– with-md5-asm 使用 md5 源文件编译
– with-sha1=DIR 设定 sha1 库文件路径
– with-sha1-opt=OPTIONS 设置 sha1 运行参数
– with-sha1-asm 使用 sha1 源文件编译
– with-zlib=DIR 设定 zlib 库文件路径
– with-zlib-opt=OPTIONS 设置 zlib 运行参数
– with-zlib-asm=CPU 使 zlib 对特定的 CPU 进行优化 , 可选参数 :
pentium, pentiumpro
– with-openssl=DIR 设定 OpenSSL 库文件路径
– with-openssl-opt=OPTIONS 设置 OpenSSL 运行参数
– with-debug 允许调试日志
介绍一个 Nginx 外部模块 :
ngx_http_accesskey_module
封堵下载软件的好东东 , 只有远程 IP 地址符合加密字串的才被允许访问 . 示例如下 :
location /download {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg “ key ” ;
accesskey_signature “ mypass$remote_addr ” ;
}
模块地址 :
http://wiki.codemongers.com/NginxHttpAccessKeyModule
其它更多外部模块请访问 :
http://wiki.codemongers.com/NginxModules
在 OpenBSD 环境下安装 Nginx 需要注意下 , 在 ./configure 之后还需要修改一下源文件,否则
后面 make 过不去 :
vi +74 src/os/unix/ngx_posix_config.h
将这行的 malloc.h 改成 stdlib.h, 保存退出 .
然后再执行 make && make install 即可 !