虚拟主机
基于IP
server {
#端口
listen 80;
#主机
server_name 192.168.0.116;
#访问日志
access_log logs/192.168.0.116.access.log;
#错误日志
error_log logs/192.168.0.116.error.log;
location / {
#网页文件存放的目录
root html/192_168_0_116_web;
#默认首页文件
index index.html index.htm;
}
}
基于端口
server {
#端口
listen 8001;
#主机
server_name 192.168.0.116;
#访问日志
access_log logs/192_168_0_116_8001.access.log;
#错误日志
error_log logs/192_168_0_116_8001.error.log;
location / {
#网页文件存放的目录
root html/192_168_0_116_8001_web;
#默认首页文件
index index.html index.htm;
}
}
基于域名
server {
#端口
listen 80;
#主机
server_name api.zhanshenwukong.com;
#访问日志
access_log logs/api.zhanshenwukong.com.access.log;
#错误日志
error_log logs/api.zhanshenwukong.com.error.log;
location / {
#网页文件存放的目录
root html/api.zhanshenwukong.com;
#默认首页文件
index index.html index.htm;
}
}
日志
nginx日志主要有两种:访问日志、错误日志。
访问日志记录客户端访问nginx的每一个请求,包含用户地域来源、跳转来源、使用终端、某个URL访问量等信息,访问日志格式可以自定义;
错误日志则记录客户端访问nginx出错时的日志,格式不支持自定义,通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。
两种日志都可以选择性关闭。
访问日志
日志格式:
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;
相关说明解释
- 1.$remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200,
- 6.$body_bytes_sent :记录发送给客户端文件主体内容大小;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相关信息;
例如:
192.168.0.117 - - [29/Jun/2017:21:09:36 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
Nginx内置变量
$args #请求中的参数值
$query_string #同 $args
$arg_NAME #GET请求中NAME的值
$is_args #如果请求中有参数,值为"?",否则为空字符串
$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri #同 $uri
$document_root #当前请求的文档根目录或别名
$host #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname #主机名
$https #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent #传输给客户端的字节数
$connection #TCP连接的序列号
$connection_requests #TCP连接当前的请求数量
$content_length #"Content-Length" 请求头字段
$content_type #"Content-Type" 请求头字段
$cookie_name #cookie名称
$limit_rate #用于设置响应的速度限制
$msec #当前的Unix时间戳
$nginx_version #nginx版本
$pid #工作进程的PID
$pipe #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr #客户端地址
$remote_port #客户端端口
$remote_user #用于HTTP基础认证服务的用户名
$request #代表客户端的请求地址
$request_body #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method #HTTP请求方法,通常为"GET"或"POST"
$request_time #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme #请求使用的Web协议,"http" 或 "https"
$server_addr #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name #服务器名
$server_port #服务器端口
$server_protocol #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status #HTTP响应代码
$time_iso8601 #服务器时间的ISO 8610格式
$time_local #服务器时间(LOG Format 格式)
$cookie_NAME #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie
$http_host #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent #用户终端浏览器等信息
$http_x_forwarded_for
#客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
$sent_http_NAME #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding
修改访问日志格式:
log_format access
'[remote_ip:$remote_addr] '
'[remote_user:$remote_user] '
'[querytime:$time_local] '
'[request_url:$request] '
'[request_status:$status] '
'[request_byte_B:$bytes_sent] '
'[request_time_s:$request_time] '
'[http_referer:$http_referer] '
'[gttp_agent:$http_user_agent] ';
访问日志:
access_log logs/192_168_0_116_8001.access.log access;
旧日志:
192.168.0.117 - - [29/Jun/2017:21:33:06 +0800] "GET /?page=10 HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
新日志:
[remote_ip:192.168.0.117] [remote_user:-] [querytime:29/Jun/2017:21:34:28 +0800] [request_url:GET /?page=10 HTTP/1.1] [request_status:304] [request_byte_B:178] [request_time_s:0.000] [http_referer:-] [gttp_agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36]
注:生产环境根据自己的需求来进行定制
错误日志
日志级别:debug | info | notice | warn | error | crit | alert | emerg
级别越高,记录的信息越少
#error_log 是关键字,file 是保存错误日志的文件路径,level 是错误日志级别
error_log file level ;
位置:错误日志可以配置在 main 区,也可以配置在虚拟主机配置文件中
error_log logs/192.168.0.116.error.log debug;
日志输出:
2017/06/29 21:47:21 [error] 2509#0: *4 open() "/opt/nginx/html/192_168_0_116_8001_web/ucenter.html" failed (2: No such file or directory), client: 192.168.0.117, server: 192.168.0.116, request: "GET /ucenter.html HTTP/1.1", host: "192.168.0.116:8001"
日志切割
方法有很多,这个采用shell完成
#!/bin/bash
###############################################################
## 每日零点执行该脚本,备份旧日志,产生新日志
###############################################################
## Nginx 日志文件所在的目录
LOGS_PATH=/opt/nginx/logs
## 获取昨天的 yyyy-MM-dd
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
## 移动文件
mv ${LOGS_PATH}/192_168_0_116_8001.access.log ${LOGS_PATH}/192_168_0_116_8001.access_${YESTERDAY}.log
## 向 Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件
#kill -USR1 $(cat /opt/nginx/logs/nginx.pid)
/opt/nginx/sbin/nginx -s reopen
脚本完成后保存在指定目录(/opt/nginx/scripts/nginx_cut.sh),,之后 crontab -e 新增定时任务:
0 0 * * * /bin/bash /opt/nginx/scripts/nginx_cut.sh
添加完成后在测试一下
[root@bogon logs]# ls -l 192_168_0_116_8001.*
-rw-r--r--. 1 www root 3665 6月 29 21:47 192_168_0_116_8001.access_2017-06-28.log
-rw-r--r--. 1 www root 0 6月 29 21:52 192_168_0_116_8001.access.log
-rw-r--r--. 1 www root 1265 6月 29 21:47 192_168_0_116_8001.error.log
已经切割完成,哈哈!
开启Gzip压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
#gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
配置解释:
- 第1行:开启Gzip
- 第2行:不压缩临界值,大于1K的才压缩,一般不用改
- 第3行:buffe
- 第4行:这句的话注释了就行了,默认是HTTP/1.1
- 第5行:压缩级别,1-10,数字越大压缩的越好,耗时
- 第6行:进行压缩的文件类型
- 第7行:跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding",
- 第8行:IE6进行Gzip压缩
Nginx开启Gzip压缩大幅提高页面加载速度
自动索引
在location server 或 http段中加入
autoindex on;
#默认为on,显示出文件的确切大小,单位是bytes。
#改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_exact_size off;
#默认为off,显示的文件时间为GMT时间。
#改为on后,显示的文件时间为文件的服务器时间
autoindex_localtime on;
例如:
location / {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
浏览器缓存
语法: expires [time|epoch|max|off]
默认值: expires off
作用域: http, server, location
控制HTTP应答中的“Expires”和“Cache-Control”的头标,(起到控制页面缓存的作用)。
expire参数接受的值可以是:
expires 1 January, 1970, 00:00:01 GMT; //设定到具体的时间
expires 60s; //60秒
expires 30m; //30分钟
expires 24h; //24小时
expires 1d; //1天
expires max; //max表示过期时间为31 December 2037 23:59:59 GMT
expires off; //永远重新读取
例如:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
access_log off;
}
location ~ .*\.(js|css)$
{
expires 12h;
access_log off;
}
Nginx+php
PHP5.6+Nginx1.9.7