1.虚拟主机
nginx可以配置多种类型的虚拟主机:基于ip地址,基于域名,基于端口号
1)基于ip地址
在讲解基于ip的虚拟主机之前,先介绍一下ip别名。
IP别名背后的概念很简单:可以在一块物理网卡上绑定多个IP地址.这样就能够在使用单一网卡的同一服务器上运行多个基于IP的虚拟主机.
如果要在eth0网卡设备上添加两个IP别名192.168.8.43和192.168.8.44可以通过以下ifconfig 和route命令来进行:
/sbin/ifconfig eth0:1 192.168.8.43 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.8.43 dev eth0:1
/sbin/ifconfig eth0:2 192.168.8.44 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.8.44 dev eth0:2
配置后如果能从另外一台服务器ping 192.168.8.43和192.168.8.44 ,如果能ping通,则证明配置无误.
但是通过ifconfig 和route配置的IP别名在服务器重启后会消失.不过可以将这两条命令添加到/etc/rc.local文件中,让系统开机时自动运行,
vi /etc/rc.local在文件末尾增加以下内容,然后保存即可.
/sbin/ifconfig eth0:1 192.168.8.43 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.8.43 dev eth0:1
/sbin/ifconfig eth0:2 192.168.8.44 broadcast 192.168.8.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.8.44 dev eth0:2
分别对192.168.8.43,192.168.8.44,192.168.8.45三个IP配置三个纯静态HTML支持的虚拟主机
http{
}
2)基于域名
基于域名的虚拟主机是最常见的虚拟主机,只需配置DNS服务器,将每个主机名映射到正确的IP地址,然后配置Nginx服务器,
令其识别不同的主机名即可.这种技术可以使很多虚拟主机共享同一个IP地址.
Nginx中配置基于域名的虚拟主机.主机1对aaa.domain.com的访问都由它来处理,主机2对bbb.otherdomain.com的访问都由
它来处理,主机3对域名www.domain.com,domain.com及aaa.domain.com之外的所有*.domain.com二级域名的访问都由它来处理
.每个虚拟主机的网页文件分别存放在了不同的目录中,每个虚拟主机使用了不同的日志文件来记录访问日志.配置情况如下:
http{
}
3)基于端口号
基于端口号的虚拟主机是通过给每个server配置一个不同的监听端口实现的
2.日志格设置格式为:
log_format name format [format ...]
name 表示定义的格式名称 , format 表示定义的格式样式. log_format有一个默认的,无须设置的combined日志格式设置.也可以自定义一份日志记录格式,不过需要意,log_format指令设置的name名称在Nginx配置文件中是不能重复的.
具体参数如下:
log_format combined '$remote_addr - $remote_user [$time_local] '
注意:如果Nginx作为Web服务器,位于负载均衡设备,Squid,Nginx反向代理之后,就没法获得客户端的真实IP地址了.即$reomte_addr变量拿到得不是客户端的IP地址,而是反向代理服务器的IP地址.但是反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forwarded-For信息,用来记录原有的客户端IP地址和原来客户端请求的服务器地址.这个时候可以自定义日志格式.如下.
log_format mylogformat '$http_x_forwarded_for - $remote_user [$time_local]'
在日志格式中,变量
$remote_addr 和$http_x_forwarded_for用于记录IP地址
$remote_user 用来记录远程客户端用户名称;
$time_local用于记录访问时间与时区;
$request用于记录请求URL与HTTP协议;
$status用于记录请求状态,例如成功时状态为200,页面找不到时状态为404;
$body_bytes_sent用于记录发送给客户端的文件主体内容大小
$http_referer用于记录是从哪个页面链接访问过来的;
$http_user_agent用于记录客户端浏览器的相关信息
日志信息如下:
123.42.4.194 - - [12/Mar/2009:02:18:23 +0800] "GET / HTTP/1.1" 200 36179 "-" "Mozilla/4.0 (compatible;MSIE 7.0;Windows NT 5.1;Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.1; SV1) ; CIBA; .NET CLR 2.0.50727)"
分别对应以上的变量式自定义
3.其它
1)设置日志内存缓冲区,缓冲日志
2)设置日志文件描述符缓冲区,用于缓冲经常需要打开的日志,避免日志的反复打开、关闭操作
例如:open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m ;
max:设置缓存中的最大文件描述符数量
inactive: 设置一个时间,如果在设置的时间内没有使用此文件描述符,则自动删除此描述符,默认是10秒
min_uses:在参数inactive指定的时间范围内,如果日志文件超过被使用的次数,则将该日志文件的描述符记入缓存,默认次数为1.
valid:设置检查时间,看变量指定的日志文件路径与文件名是否仍然存在,默认时间为60秒.
3)日志文件的切割
切割命令如下:
mv /data1/logs/access.log /data1/logs/20090318.log
kill -USR1 Nginx主进程号
或者(如果在配置文件中使用了 pid /usr/local/webserver/nginx/nginx.pid指令)
mv /data1/logs/access.log /data1/logs/20090318.log
kill -USR1 'cat /usr/local/webserver/nginx/nginx.pid' 这样的话就不用ps查找Nginx主进程号了.
如果要让它每天定时切割日志,可以编写shell脚本.并且利用crontab来每天定时运行.
shell 脚本代码:
#!/bin/bash
#定义Nginx日志文件的存放路径
logs_path = "/data1/logs/"
mkdir -p ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday"+"%m")/
access_$(date -d "yesterday" + "%Y%m%d").log
kill -USR1 'cat /usr/local/webserver/nginx/nginx.pid'
再配置crontab,输入crontab -e
输入:
00 00 * * * /bin/bash /usr/loca/webserver/nginx/sbin/cut_nginx_log.sh
shell脚本和crontab配置主要实现的功能是:假设今天的日期为2009年5月19日,Nginx当前的日志文件为/data1/logs/access.log,2009年5月20日00:00会执行cut_nginx_log.sh脚本,cut_nginx_log.sh脚本首先创建一个目录/data1/logs/2009/05/,然后将/data1/logs/access.log文件移动并重命名为/data1/logs/2009/05/access_20090519.log,再发送kill -USR1信号给Nginx主进程,告诉Nginx重新生成一个/data1/logs/access.log文件,2009年5月20日的日志记录在这个新生成的日志文件中。而/data1/logs/2009/05/access_20090519.log文件,就是2009年5月19日的日志文件
4)压缩传输
经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样用户浏览页面的时候速度会快很多.服务器压缩,浏览器解压