Nginx 的中文维基
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经由于它的稳定性、丰富的功能集、 示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;国内几个重要的视频分享网站也部署了Nginx,如六房间、酷6等。 新近发现Nginx 技术在国内日趋火热,愈来愈多的网站开始部署Nginx。html
使用BSD协议 2011市场占有率为nginx5.3% apache70% IIS 20.5%
Nginx优点
1.高并发,CPU消耗低
Nginx支持5W高并发链接,实际2-4W.
使用epoll(linux2.6内核)和kqueue(freeBSD)网络模型
而Apache使用传统select模型和prefork多进程模式
2.内存消耗少
同等硬件条件下Nginx的处理能力是Apache的5-10倍
3.成本低廉
使用BSD协议发行
4.其它优点
配置简单、支持Rewrite重写、内置健康检查功能、节省带宽、稳定性高、支持热部署
Nginx的版本
Nginx分旧稳定版、新稳定版和开发版三个版本
从0.7版本开始支持windows版,但其效率较低下
Nginx编译需求
10M磁盘空间
GCC编译器
autoconf和automake工具
模块依赖性
gzip模块须要zlib库
rewrite模块须要pcre库
SSL功能须要Openssl库
./configure经常使用参数
--prefix=<path> 安装路径,默认为/usr/local/nginx
--sbin-path=<path> 执行文件安装路径,默认为<prefix>/sbin/nginx
--conf-path=<path> 在没有给定-c选项下的默认路径,默认为<prefix>/conf/nginx.conf
--pid-path=<path> PID路径,没有指定PID下的路径为<prefix>/logs/nginx.pid
--lock-path=<path> nginx.lock文件路径
--error-log-path=<path> 错误日志路径
--http-log-path=<path> access_log路径
--user=<user> Nginx使用用户,默认为nobody
--group=<group> Nginx使用的组,默认为nobody
--with-resig_module 启用rtsig模块
--with-select_module 是否容许启动SELECT模式,如没有Kqueue.epoll.rtsig或poll,select模式僵尸默认模式
--with-poll_module 没有更好的模式则启动poll模式
--with-http_ssl_module 开启SSL模块,debian上是libssl
--with-http_realip_module 启动htto_realip_module
--with-http_addition_module 启动http_addittion_module
--with-http_sub_module 启动http_sub_module
--with-http_flv_moudle 启动flv模块
--with-http_charset_module 禁用server status页
--with-http_gzip_module 禁用gzip
--with-http-rewrite_module 禁用rewrite
--with-http_proxy_module 禁用proxy
--with-http_perl_module 禁用perl模块
--http-client-body-temp-path=PATH http客户端请求缓存文件路径
--http-proxy-tmp-path=PATH http反向代理缓存文件目录
--without-http 禁用http SERVER
--with-mail 启用IMAP4/POP3/SMTP代理
--with-mail_ssl_module maillsll模块
--without-pcre 禁用PCRE库
--with-zlib=DIR zlib库路径
--with-openssl=DIR openssl库路径
--with-dubug 启用调速日志
--add-module=PATH 添加第三方模块的目录
./configure
--user=www --group=www --with-pcre=/usr/include/pcre --with-http_stub_status_module --prefix=/usr/local/nginx --with-http_ssl_module
启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
如不加-c则默认使用安装目录下/conf/nginx.conf
配置检查
nginx -t -c /usr/local/nfinx/conf/nginx.conf
平滑重启,从新加载配置文件
ps -ef|grep nginx
kill -HUP `cat \usr\local\nginx\logs\'nginx.pid`
其它信号
TERM,INT 快速关闭
QUIT 从容关闭
USR1 从新打开日志
USR2 平滑升级
WITCH 从容关闭工做进程
平滑升级
在不中断服务的状况下使用新版本、从新编译的程序
1.备份旧的执行文件
2.kill -USR2 旧版本主进程号
旧的.pid文件将重命名为old.bin而后执行新的可执行程序
依次启动新主进程和工做进程
3.此时新旧版本同时运行,使用WINCH信号发送给旧的主进程,而后他的工做进程也将从容关闭
kill -WINCH 旧版本主进程号
4.一段时间后旧的工做进程处理已有链接请求后退出
5.此时可决定是否使用新的进程
如不使用
kull -HUP 旧进程号 不重载配置文件下重启工做进程
kill -QUIT 新主进程 从容关闭其工做进程
kill -TERM 新主进程 强制退出
新进程退出后旧进程将移除.oldbin前缀,恢复到.pid文件
若是使用
kill -QUIT 旧的主进程
虚拟主机的配置
----------------------------------------------------------------------------------
worker_processes 1;
#指定工做衍生进程数(通常为CPU总核心数的两倍)
events
{
worker_connections 1024;
#容许的链接数量
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server
{
listen 80;
server_name www.vspace.tk *.vspace.tk;
access_log logs/www.vspace.tk main;
location /
{
root /etc/web/www;
index index.html index.htm;
}
}
server
{
listen 80;
server_name bbs.vspace.tk;
access_log log/bbs.vspace.tk combined;
location /
{
root /etc/web/bbs;
index index.html index.htm;
}
}
}
--------------------------------------------------------------------------------
3)虚拟主机配置文件详解
因为虚拟主机分别有一个文件来指定,下面举例某个虚拟主机的配置以下:
[root@oracle132 vhosts]#
vi /usr/local/nginx/conf/vhosts/www.test.com.conf;
server {
listen 80; #虚拟主机使用端口
server_name www.test.com; #虚拟主机访问域名
charset UTF-8; #设定nginx默认字符编码
#access_log logs/host.access.log main;
#全部jpg格式的图片都有nginx来处理
location ~ \.jpg$ {
root /cicro/cws3/vhosts/www.test.com/ROOT;
expires 30d;
}
#全部gif格式的图片都有nginx来处理
location ~ \.gif$ {
root /cicro/cws3/vhosts/www.test.com/ROOT;
expires 30d;
}
# upload和html下全部文件都有nginx来处理前端
location ~ ^/(upload|html)/ {linux
root /cicro/cws3/vhosts/www.test.com/ROOT;nginx
expires 30d;web
}算法
#除去上面的文件,剩下的全部都代理给http://127.0.0.1:8009来访问shell
location / {apache
root /cicro/cws3/vhosts/www.test.com/ROOT;windows
index index.html;
proxy_pass http://127.0.0.1:8009;
}
#设定查看Nginx状态的地址
location /NginxStatus {
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file ../htpasswd;
}
#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;
}
}
在上面有设置查看Nginx状态的地址,须要apache的htpasswd 来生成一个登陆验证文件,这样生成一个htpasswd 文件:
[root@oracle132 vhosts]# /usr/local/bin/htpasswd -c htpasswd gaojf
New password: (此处输入您的密码)
Re-type new password: (再次输入您的密码)
Adding password for user gaojf
上面 /usr/local/bin/htpasswd 是htpasswd 文件的执行路径,若是没有这个文件,能够从apache的bin目录拷贝一个过来便可!
-c是建立一个文件
-c后面的httpasswd是建立验证文件的名字.
gaojf是建立的用户
#查看nginxstatus:
http://www.test.com/nginxstatus/,输入验证账号密码,便可看到相似以下内容:
Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324
第一行表示如今活跃的链接数
第三行的第三个数字表示Nginx运行到当前时间接受到的总请求数,假如快达到了上限,就须要加大上限值了。
日志
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
若是web前端存在中间层则收集不到remote_addr而是拿到前端的地址
可是反向代理在转发请求的http头信息中,能够增长X-Forwarded-For信息,来记录原有客户端IP
logs/www.log
192.168.10.138 - - [19/Mar/2011:18:04:59 +0800] "GET / HTTP/1.1" 200 34 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)" "-"
127.0.0.1 - - [19/Mar/2011:19:02:43 +0800] "GET / HTTP/1.1" 200 34 "-" "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16" "-"
access_log
access_log /data/logs/web1.log main
也可以使用变量
access_log /data/logs/$server_name.log main
但有一些限制,1.Nginx进程的用户和组必须有该路径的读写权限
2.缓存将不会被使用
3.对于每一条日志记录,日志文件都将先打开文件再写入日子而后关闭
为了提升包含变量的日志文件存放路径的性能须要使用open_log_file_cache指令设置经常常被使用的日志文件描述符缓存
open_log_file_cache指令主要用来设置含有变量的日子路径的文件描述符缓存
语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off
默认我禁止
max:设置缓存中的最大文件描述符数量。如超过则使用LRU算法清除“较不经常使用的文件描述符”
iniactive:设置一个时间,若是时间内没有使用此文件描述符则删除,默认10s
min_uses:在inactive指定时间范围内,若是日志文件超过被使用次数则记入缓存,默认为1
valid:设置多久检查一次,看看变量指定的日志文件路径与文件名是否存在,默认60s
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m
Nginx日志文件的切割
nginx不支持像Apache同样使用cronolog来轮转日志,可是能够采用如下方式来实现日志文件的切割
mv /data/logs/access.log /data/logs/20110101.log
kill -USR1 Nginx主进程号
能够经过crontab和shell脚原本实现日志切割的自动化
nginx_cut_log.sh
---------------------------------------------------------------------
#!/bin/bash
#这个脚本须在天天00:00运行
#Nginx 日志文件的存放路径
logs_path="/usr/loacl/nginx/logs/"
mkdir -p ${log_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
-------------------------------------------------------------------------
crontab -e
00 00 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh
nginx浏览器本地缓存设置
语法:expir [time|epoch|max|off] 默认为off
做用域:http、server、location
控制http应答中的expires和cache-control的header头信息起到控制页面缓存的做用
time为当前时间-/+来得到
负数表示no-cache
正数或零表示max-age=time
epoch指定expires值为1 January,1970,00:00:01 GMT
max指定expires值为31 December 2037 23:59:59 GMT
-1:指定“Expires”的值为当前服务器时间-1s,即永远过时。
off:不修改“Expires”和"Cache-Control"的值
例如
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
安装过程
PHP加速
; eaccelerator
[eaccelerator]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="128"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.keys = "disk_only"
eaccelerator.sessions = "disk_only"
eaccelerator.content = "disk_only"
eaccelerator.allowed_admin_path = "/ext/web/www/eaccelerator/control.php"
内核优化