WEB服务-Nginx之3-配置文件和虚拟主机和日志管理
WEB服务-Nginx之3-配置文件和虚拟主机和日志管理
Nginx目录结构
nginx编译安装目录结构
[root@web01 ~]# ll /apps/nginx/
total 0
drwx------ 2 nginx root 6 Sep 10 15:40 client_body_temp
drwxr-xr-x 2 root root 333 Sep 10 15:45 conf
drwx------ 2 nginx root 6 Sep 10 15:40 fastcgi_temp
drwxr-xr-x 2 root root 40 Sep 10 15:38 html # 测试页
drwxr-xr-x 2 root root 58 Sep 10 22:32 logs
drwx------ 2 nginx root 6 Sep 10 15:40 proxy_temp
drwxr-xr-x 2 root root 19 Sep 10 15:38 sbin # 主程序
drwx------ 2 nginx root 6 Sep 10 15:40 scgi_temp
drwx------ 2 nginx root 6 Sep 10 15:40 uwsgi_temp
[root@web01 ~]# ll /apps/nginx/sbin/
total 7596
-rwxr-xr-x 1 root root 7774216 Sep 10 15:38 nginx # 程序文件
[root@web01 ~]# ll /apps/nginx/html/
total 8
-rw-r--r-- 1 root root 494 Sep 10 15:38 50x.html
-rw-r--r-- 1 root root 612 Sep 10 15:38 index.html # 默认测试网页
nginx官方源安装目录结构
[root@web01 ~]# ll /usr/sbin/nginx
-rwxr-xr-x 1 root root 1342640 Apr 21 23:07 /usr/sbin/nginx # 程序文件
[root@web01 ~]# ll /usr/share/nginx/html/
total 8
-rw-r--r-- 1 root root 494 Apr 21 23:07 50x.html
-rw-r--r-- 1 root root 612 Apr 21 23:07 index.html # 默认测试网页
nginx 不带参默认为启动nginx -t 测试nginx语法错误 -c filename 指定配置文件(default: /etc/nginx/nginx.conf) -s signal 发送信号给master进程,signal:stop, quit, reopen, reload -g directives 从配置文件中设置全局指令 示例: nginx -s stop # 停止nginx nginx -s reload # 加载配置文件
Nginx配置文件
使用rpm -ql nginx
查看Nginx
整体的目录结构及对应的功能,如下表格整理了Nginx
比较重要的配置文件
- Nginx主配置文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/nginx.conf | 配置文件 | nginx主配置文件 |
/etc/nginx/conf.d/default.conf | 配置文件 | 默认网站配置文件 |
- Nginx子配置文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/conf.d/* | 配置文件 | 网站配置文件 |
- Nginx代理相关参数文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/fastcgi_params | 配置文件 | Fastcgi代理配置文件 |
/etc/nginx/scgi_params | 配置文件 | scgi代理配置文件 |
/etc/nginx/uwsgi_params | 配置文件 | uwsgi代理配置文件 |
- Nginx编码相关配置文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/win-utf | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/koi-utf | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/koi-win | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/mime.types | 配置文件 | Content-Type与扩展名 |
- Nginx管理相关命令
路径 | 类型 | 作用 |
---|---|---|
/usr/sbin/nginx | 命令 | Nginx命令行管理终端工具 |
/usr/sbin/nginx-debug | 命令 | Nginx命令行与终端调试工具 |
- Nginx日志相关目录与文件
路径 | 类型 | 作用 |
---|---|---|
/var/log/nginx | 目录 | Nginx默认存放日志目录 |
/etc/logrotate.d/nginx | 配置文件 | Nginx默认的日志切割 |
配置文件配置语法:
directive value [value2 ...];
注意:
- 指令必须以分号结尾
- 支持使用配置变量
- 内建变量:由Nginx模块引入,可直接引用
- 自定义变量:由用户使用set命令定义
帮助文档
http://tengine.taobao.org/nginx_docs/cn/docs/
https://cloud.tencent.com/developer/doc/1158
Nginx主配置文件
Nginx主配置文件/etc/nginx/nginx.conf
是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}
来表示开始与结束。
Nginx主配置文件整体分为三块,分别是CoreModule(核心模块)
,EventModule(事件驱动模块)
,HttpCoreModule(http内核模块)
CoreModule(核心模块)
user nginx; # Nginx进程所使用的用户,若组不指定,默认和用户名同名
worker_processes 1; # Nginx运行的work进程数量(建议与CPU数量一致或auto)
error_log /var/log/nginx/error.log warn; # Nginx错误日志文件存放路径及其级别,可设定为debug,需要编译时使用“--with-debug”选项
pid /var/run/nginx.pid; # Nginx服务运行后产生的pid进程号
master_process on; # 是否启动工作进程,默认on;off,将不启动worker
daemon on; # 是否以守护进程方式运行,默认on;off,即以前台方式运行。用于调试或docker环境。
EventModule(事件驱动模块)
events {
worker_connections 25535; # 每个worker进程支持的最大连接数(建议改为25535),不能大于系统限制的进程能打开的文件数量上限
use epoll; # 指定并发连接请求的处理方法:事件驱动模型, 默认epoll
accept_mutex on; # 处理新的连接请求的方法:on则由各个worker轮流处理新请求,Off则每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能,默认值为off,优化为on。
multi_accept on; # off则一个worker进程只能一次接受一个新的网络连接, on则每个woker进程同时接受多个新网络连接,默认值是off,可以优化为on。
}
HttpCoreModule(http内核模块)
# http层开始
http {
# 服务器包含资源类型的配置文件,MIME是网络资源的媒体类型,有HTML/GIF/XML/Flash等类型
include /etc/nginx/mime.types;
# 默认以下载方式传输给浏览器(前提是该资源在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 /var/log/nginx/access.log main;
# 高效文件传输
sendfile on;
# 搭配sendfile使用
#tcp_nopush on;
# 长连接超时时间
keepalive_timeout 65;
# 是否开启压缩
#gzip on;
# 使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
server {
listen 80; # 监听端口, 默认80
server_name oldboy.com; # 提供的域名
access_log access.log; # 该网站的访问日志
# 控制网站访问路径
location / {
root /usr/share/nginx/html; # 存放网站源代码的位置
index index.html index.htm; # 默认返回网站的文件
}
}
...
# 第二个虚拟主机配置
server {
...
}
# 包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
include /etc/nginx/conf.d/.conf;
# http层结束
}
http{}层下允许有多个Server{}层,一个Server{}层下又允许有多个Location
- http{} 标签主要用来解决用户的请求与响应。
- server{} 标签主要用来响应具体的某一个网站。
- location{} 标签主要用于匹配网站具体URL路径。
MIME参考文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
server_name
后可跟多个由空白字符分隔的字符串,匹配优先级机制从高到低(1) 字符串精确匹配 如:www.magedu.com (2) 左侧*通配符 如:*.magedu.com (3) 右侧*通配符 如:www.magedu.* (4) 正则表达式 如: ~^.*\.magedu\d+\.com$ # \d 表示 [0-9] (5) default_server
主配置文件其他区块
MailModule(mail模块)
默认情况下未构建此模块,应使用--with-mail
配置参数启用它。
StreamModule(stream模块)
默认情况下未构建此模块,自1.9.0版开始可用,应使用--with-stream
配置参数启用它 。
Nginx内建全局变量
$args : 这个变量等于请求URI中的参数,同$query_string
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$cookie_name : 表示key为 name 的cookie值
$document_root : 当前请求在root指令中指定的系统根目录,如/apps/nginx/html/
$document_uri : 与$uri相同。
$host : 请求主机头字段,否则为服务器名称。
$http_user_agent : 客户端agent信息(浏览器的详细信息)
$http_cookie : 客户端cookie信息
$limit_rate : 显示nginx服务器限制的连接速率。没有设置,则显示0。
$query_string :http://www.baidu.com/index.do?id=090&partner=search中的id=090&partner=search
$request_body_file ;nginx做反向代理时发给后端服务器的本地资源的名称
$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成的文件绝对路径。
$request_method : 客户端请求的动作,通常为GET/POST/PUT/DELETE等。
$request_uri : 包含请求参数的原始URI,不包含主机名,如:index.do?id=090&partner=search。
$remote_addr : 客户端IP地址。
$remote_port : 客户端端口。
$remote_user : 已经经过Auth Basic Module验证的用户名。
$scheme : 协议(如ftp,http,https)。
$server_protocol : 服务器协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name : 服务器主机名
$server_port : 服务器端口
$uri : 不包含请求参数的当前URI,$uri不包含主机名,如”/core/index.do”。
Nginx自定义变量
ngx_http_rewrite_module
用于使用PCRE正则表达式更改请求URI,返回重定向并有条件地选择配置。
-
定义变量:
set variable value;
Syntax: set $variable value; Default: — Context: server, location, if
-
引用变量:
$variable_name
示例:
set $name magedu;
echo $name;
set $my_port $server_port;
echo $my_port;
echo "$server_name:$server_port";
Nginx网站配置
- 新增
nginx
配置文件
[root@web01 conf.d]# cat /etc/nginx/conf.d/game.conf
server {
listen 80;
server_name game.oldboy.com;
location / {
root /code;
index index.html;
}
}
- 将游戏源代码文件放至
nginx
配置文件root指定的目录
[root@web01 conf.d]# mkdir /code && cd /code
[root@web01 code]# rz html5.zip
[root@web01 code]# unzip html5.zip
[root@web01 code]# ls
ceshi game html5.zip img index.html readme.txt
- 检查
nginx
配置文件的语法是否存在错误
[root@web01 code]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
- 重载
Nginx
[root@web01 code]# systemctl reload nginx
- 设置客户机hosts
MacBook-Pro:~ oldboy$ sudo vim /etc/hosts
10.0.0.7 game.oldboy.com
- 检测是否设置成功
MacBook-Pro:~ oldboy$ ping game.oldboy.com
PING game.oldboy.com (10.0.0.7): 56 data bytes
64 bytes from 10.0.0.7: icmp_seq=0 ttl=64 time=0.267 ms
64 bytes from 10.0.0.7: icmp_seq=1 ttl=64 time=0.450 ms
64 bytes from 10.0.0.7: icmp_seq=2 ttl=64 time=0.508 ms
- 浏览器检测
打开浏览器访问:http://game.oldboy.com
Nginx虚拟主机
通常在企业中可能会有很多业务系统,那么多套业务服务如何使用Nginx
配置?
如果使用如上方式部署,则需要多台服务器配置Nginx,但如果使用虚拟主机方式,则在同一个Nginx上运行多套单独服务,这些服务是相互独立的。简单来说,看似多套业务系统,实则可以运行在一台Nginx服务上。
Nginx配置虚拟主机有如下三种方式:
方式一、基于多IP方式
方式二、基于多端口方式
方式三、基于多域名方式(多个hosts名称方式)
基于多IP方式
基于多IP方式,有如下两种方式:
具体配置如下:
- 配置多网卡多IP的方式
server {
...
listen 10.0.0.10:80;
...
}
server {
...
listen 10.0.0.11:80;
...
}
- 配置单网卡多IP的方式
# 给网卡添加一个IP
[root@web01 ~]# ip addr add 10.0.0.11/24 dev eth0
# 虚拟主机配置
server {
...
listen 10.0.0.10:80;
...
}
server {
...
listen 10.0.0.11:80;
...
}
基于多端口方式
具体配置如下:
# 仅修改listen监听端口即可, 但不能和系统端口出现冲突
server {
...
listen 80;
...
}
server {
...
listen 81;
...
}
server {
...
listen 82;
...
}
基于多域名方式
具体配置如下:
- 创建对应的web站点目录以及程序代码
[root@web01 ~]# mkdir /code/{server1,server2}
[root@web01 ~]# echo "server1" > /code/server1/index.html
[root@web01 ~]# echo "server2" > /code/server2/index.html
- 配置不同域名的虚拟主机
[root@web01 ~]# cat /etc/nginx/conf.d/server1.conf
server {
listen 80;
server_name 1.oldboyedu.com;
root /code/server1;
index index.html;
...
}
[root@web01 ~]# cat /etc/nginx/conf.d/server2.conf
server {
...
listen 80;
server_name 2.oldboyedu.com;
root /code/server2;
index index.html;
}
Nginx日志管理
Nginx有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志。
访问日志是记录客户端即用户的具体请求内容信息,全局配置模块中的error_log是记录nginx服务器运行时的日志保存路径和记录日志的level,因此有着本质的区别。
而且Nginx的错误日志一般只有一个,但是访问日志可以在不同server中定义多个,定义一个日志需要使用access_log指定日志的保存路径,使用log_format指定日志的格式,格式中定义要保存的具体日志内容。
日志格式
log_format
定义日志格式语法
# 配置语法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http
Nginx
默认日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
Nginx
日志格式允许包含的内置变量
$remote_addr # 记录客户端IP地址
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$time_iso8601 # 记录ISO8601标准格式下的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for # 记录客户端IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)
$request_time # 请求花费的时间,单位为秒,精度毫秒
注意:
如果Nginx位于负载均衡器,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址。
此时$remote_addr,获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中提供$http_x_forwarded_for,用来记录客户端IP地址和客户端请求的服务器地址。
access_log
日志配置语法
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off; # 不记录日志
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
Nginx Access
日志配置示例
server {
listen 80;
server_name code.oldboy.com;
#将当前的server网站的访问日志记录至对应的目录,使用main格式
access_log /var/log/nginx/code.oldboy.com.log main;
location / {
root /code;
}
#当有人请求改favicon.ico时,不记录日志
location /favicon.ico {
access_log off;
return 200;
}
}
- 使用实例一:favicon.ico
favicon.ico图标是网站的缩略标志,当使用浏览器访问页面时,浏览器会自动发起请求获取favicon.ico文件,但当favicon.ico文件不存在时,服务器会记录404日志,而且浏览器的该请求也会收到404报错。
解决方案:
- 提供
favicon.ico
文件和index.html
放在一起 - 服务器不记录日志:
location = /favicon.ico {
log_not_found off; # 不记录文件没发现事件到error_log
access_log off; # 不记录请求事件access_log
}
- 使用实例二:json格式
nginx默认访问日志记录内容相对比较单一,默认的格式也不方便后期做日志统计分析,生产环境中通常将nginx日志转换为json格式,然后使用日志分析工具ELK,做日志收集-统计-分析。
http{
...
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"uri":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
access_log /var/log/nginx/access.log access_json;
}
json格式日志含义:
"@timestamp":日志时间戳
"host":主机ip
"clientip":客户端请求ip
"size":请求大小
"responsetime":响应时长
"upstreamtime":转发时长
"upstreamhost":转发的目标机器及端口
"http_host":请求的域名
"url":请求的后缀
"referer":实际请求的转发域名
"agent":客户端请求源类型
"status":http状态码
json格式日志内容:
{"@timestamp":"2016-04-25T13:16:29+08:00","host":"192.168.0.202","clientip":"106.120.73.171","size":0,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"samsung.chinacloudapp.cn","url":"/index1.html","domain":"samsung.chinacloudapp.cn","xff":"-","referer":"-","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36","status":"304"}
json格式日志,python访问统计脚本:
[root@web01 ~]# cat nginx_json.py
#!/usr/bin/env python
#coding:utf-8
status_200= []
status_404= []
with open("access_json.log") as f:
for line in f.readlines():
line = eval(line)
if line.get("status") == "200":
status_200.append(line.get)
elif line.get("status") == "404":
status_404.append(line.get)
else:
print("状态码 ERROR")
f.close()
print "状态码200的有--:",len(status_200)
print "状态码404的有--:",len(status_404)
日志切割
默认使用logrotate
切割日志
[root@web01 ~]# cat /etc/logrotate.d/nginx
/var/log/nginx/.log {
daily # 每天切割日志
missingok # 日志丢失忽略
rotate 52 # 日志保留52天
compress # 日志文件压缩
delaycompress # 延迟压缩日志
notifempty # 不切割空文件
create 640 nginx adm # 日志文件权限
sharedscripts
postrotate # 切割日志执行的命令
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
日志切割后的效果
[root@web01 ~]# ll /var/log/nginx/
total 4044
-rw-r----- 1 www adm 54438 Oct 12 03:28 access.log-20181012.gz
-rw-r----- 1 www adm 28657 Oct 13 03:48 access.log-20181013.gz
-rw-r----- 1 www adm 10135 Oct 12 03:28 error.log-20181130.gz
-rw-r----- 1 www adm 7452 Oct 13 03:48 error.log-20181201.gz
日志清理
当日志文件过大时,先将有用的log日志文件进行备份,然后再清理日志。
不要删除日志文件,删除需要重启nginx,而清空日志,不需要重启,还会继续跟踪日志文件。
[root@web01 ~]# > /var/log/nginx/access_json.log # 方法一
[root@web01 ~]# cat /dev/null > /var/log/nginx/access_json.log # 方法二
1、ngx_http_log_module模块:指定日志格式记录请求
2、log_format name string ...;string可以使用nginx核心模块及其它模块内嵌的变量
3、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
4、access_log off; #禁用访问日志
5、访问日志文件路径,格式及相关的缓冲的配置
buffer=size
flush=time