摘要: nginx模块配置案例 nginx配置文件格式 nginx日常配置
Nginx能干什么
- 基本HTTP服务:可作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持过滤功能,支持SSL等
- 高级HTTP服务:进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等
- 作为邮件代理服务器,支持IMAP/POP3代理服务,支持内部SMTP代理服务功能
基本HTTP服务
- 处理静态文件,处理索引文件以及支持自动索引
- 打开并自行管理文件描述符缓存
- 提供反向代理服务,并且可以使用缓存加速反向代理,同时完成简单负载均衡及容错
- 提供远程FastCGI服务的缓存机制,加速访问,同时完成简单的负载均衡以及容错
- 使用Nginx的模块化特性提供过滤器功能,Nginx基本过滤器包括gzip压缩,ranges支持,chunked响应,XSLT,SSL以及图像缩放等
- 支持HTTP下的安全套接层协议SSL
高级HTTP服务
- 支持基于名字和IP的虚拟主机设置
- 支持HTTP/1.0 中的KEEP-Alive模式和管线PipeLined模型连接
- 支持重新加载配置和在线升级时,无须中断正在处理的请求
- 自定义访问日志格式,带缓存的日志写操作以及快速日志轮转
- 提供错误代码重定向功能
- 支持重写rewrite模块拓展
- 支持HTTP DAV模块,从而为HTTP webDAV提供PUT,DELETE,MKCOL,COPY,MOVE方法
- 支持FLV流和MP4传输
- 支持网络监控,限制等
- 支持嵌入Perl语言
邮件代理服务器
- 支持使用外部HTTP认证服务器重定向用户到IMAP/POP3后端,并支持IMAP认证方式和POP3认证方式
- 支持使用外部HTTP认证服务器认证用户后重定向连接到内部SMTP后端,并支持SMTP认证方式
- 支持右键代理服务下的安全套接层协议SSL
- 支持纯文本通信协议的扩展协议STAPTTLS
nginx服务的信号控制
信号 | 作用 |
---|---|
TREM或INT | 快速停止Nginx服务 |
QUIT | 平缓停止Nginx服务 |
USR1 | 平缓重启 |
USR2 | 重新的打开日志文件 |
WINCH | 平滑升级 |
TREM或INT | 平滑停止worker process,用于nginx服务器平滑升级 |
- 也可以使用
nginx -s 参数
或者systemctl
来管理
Nginx服务的升级
- 过程:Nginx服务接收到USR2信号后,首先将旧的nginx.pid文件添加
.oldbin
变为nginx.pid.old
文件,然后执行新版本nginx服务器的二进制文件启动服务.如果启动成功,系统中将有新旧两个nginx服务共同提供web服务,之后,需要向旧的nginx服务进程发送WINCH
信号,使旧的nginx服务平滑停止,并删除nginx.pid.oldbin
文件.
Nginx服务器基本配置指令
user nginx; #全局有效
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024; #只在events中有效
}
http { #以下指令在http部分中生效
include /etc/nginx/mime.types;
default_type application/octet-stream;
...
}
-
nginx.conf文件结构
... #全局块 events{} #events块 http{ #http块 ... #http全局块 server{ #server块 ... #server全局块 location [/]{ #location块 ... } } } ...
- 全局块:nginx服务器的配置信息
- events块:主要影响nginx服务器与用户的网络连接,
- http块:代理缓存和日志定义绝大多数功能和第三方模块的配置可以放这
- server块:每个server相当于一台虚拟主机,它内部可以有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务
- location:基于nginx服务器接收到的请求字符串,对除虚拟主机名之外的字符串进行匹配,对特定的请求进行处理
配置运行nginx服务器用户组
-
/etc/nginx/nginx.conf
下user
表示谁有权使用nginx服务group
表示哪个用户组可以使用nginx服务- 如果都允许使用nginx服务,那么直接不写user或者
user nobody nobody
- user只能在全局块中配置
配置允许生成的worker process数
- worker process是nginx服务器实现并发处理服务的关键所在
-
配置允许生成的worker process数语法为 :
worker_process number|auto;
number
指定nginx进程最多可以产生的worker process数.默认为 1auto
nginx 自动检测
配置nginx进程PID存放路径
/etc/nginx/nginx.conf
下- 配置
pid [path];
即可
配置错误日志
- 在全局块,http块,server块中都可以对nginx日志进行配置
error_log [path] [debug|info|notice|warn|error|crit|alert|emerg]
配置文件的引入
include [path]
设置网络连接的序列化
- 只能在events中配置
- "惊群问题" : 意思就是网络来一个连接,但是会同时唤醒多个睡眠进程,但是只有一个进程可以得到这个连接,如果每次唤醒的数目太多,会影响系统性能
-
为了解决上述问题,当
accept_mutex
开启时,将会对多个nginx进程接收连接进行序列化,防止多个进程对连接的争抢- 语法:
accept_mutex on | off
默认为on
- 语法:
设置是否允许同时接收多个网络连接
- 只能在events中配置
-
每个worker process都有能力同时接收多个新到达的网络连接
- 语法
multi_accept on|off;
- 默认关闭,即每个worker process一次只能接收一个新到达的网络连接
- 语法
事件驱动模型的选择
-
语法:
use method
method
的选择有:select
`pollkqueue
epollrtsig
/dev/poll`eventport
配置最大连接数
- 只能在events中配置
-
设置允许每一个worker process同时开启的最大连接数
- 语法:
worker_connections number
默认是512 - 这里的数量包括所有可能的连接数,并且number不能大于操作系统支持打开的最大文件句柄数量
- 语法:
定义MIME-Type
- MIME Type是网络资源的媒体类型:HTML, XML, GIF, FLASH 等
-
/etc/nginx/nginx.conf
下里面的两行内容include /etc/nginx/mime.types; default_type application/octet-stream;
- mime.types定义了所支持的资源类型
- default_type 定义了用于处理前端请求的MIME类型
自定义服务日志
-
也就是访问日志和日志格式的格式化问题
access_log
和log_format
-
access_log
语法:access_log path [format[buffer=size]]
- format就是
log_format
定义好的字符串,可选 - buffer就是存放日志的内存缓存区大小
- 在全局块,http块,server块,location块中配置
- 如果取消日志服务 :
access_log off;
- format就是
log_format
用于定义日志格式,并只能在http块中配置
-
配置允许sendfile方式传输文件
-
语法:
sendfile on|off
默认是off
- 在全局块,http块,server块,location块中配置
-
语法:
sendfile_max_chunk size
size默认为0- size>0,nginx进程的每个worker process每次调用sendfile传输的数据量最大不能超过这个值, size=0,无限制.
- 在全局块,http块,server块,location块中配置
配置连接超时时间
- 用户建立会话连接后,nginx服务器可以保持连接打开一段时间
-
语法:
keepalive_timeout timeout[header_timeout]
- timeout:服务器对连接的保持时间,默认75s
-
header_timeout:在报文头部的Keep_Alive设置超时时间
- 当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
- 在http块,server块,location块中配置
单链接请求数上限
-
用于限制用户通过某一连接向nginx服务器发送请求的次数
- 语法:
keepalive_request number
默认100
- 语法:
配置网络监听
- 默认的设置为:
listen *:80 | *:8000
-
其他用法
listen 192.168.1.10:8000; #监听ip上端口的链接 listen 192.168.1.10; #监听ip上所有端口的链接 listen 8000; #监听具体端口上的所有ip连接 listen 192.168.1.10 default_server backlog=1024;#设置ip的连接请求默认由虚拟主机处理,并允许最多1024网络连接同时处于挂起状态
- 更多的配置参考文档,很多参数....
基于名称的虚拟主机配置
-
设置了主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟主机发送请求了
-
语法:
server_name name {...}
- 对于name来说,可以由多个名称并列之间用空格隔开,每个名字就是一个域名
- 也可以使用正则表达式
-
虚拟主机名的匹配优先级
- 准确匹配server_name
- 通配符在开始时匹配server_name成功
- 通配符在结尾时匹配server_name成功
- 正则表达式匹配server_name成功
-
- 在测试的时候不能输入自己配置的域名,因为并没有设置域名解析服务,如果需要输入域名访问的话,那么就更改自己主机的host文件.
基于IP的虚拟主机配置
-
将一块网卡设置别名
ifconfig eth1:0 192.168.1.31 netmask 255.255.255.0 up
ifconfig eth1:1 192.168.1.32 netmask 255.255.255.0 up
- 为了让机子重启后还是有效的,可以把上面的指令加入
/etc/rc.local
中 -
配置文件
server { listen 80; server_name 192.168.1.31; location / { root /vagrant; index index.html index.htm; } } server { listen 80; server_name 192.168.1.32; location / { root /vagrant; index index.html index.htm; } }
- 请求网址后,就会展现不一样的结果
配置location块
-
语法:
location [=|~|~*|^~] uri {...}
=
:表示严格匹配~*
:用于表示uri包含正则,并且不区分大小写^~
:用于标准uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求
配置请求的根目录
-
语法:
root path
:path为nginx服务器接收到请求后查找资源的根目录路径location /data/{ root /locationtest; }
- 请求路径:
/data/index
可以匹配成功
- 请求路径:
更改location的URi
-
语法:
alias path
: alias指令改变location接收到的URI的请求路径location ~ ^/data/(.+\.(html|htm}))$ { alias /locationtest/other/$1; }
- 由上可以看出:请求路径由
/data/index.html
匹配成功后,在/locationtest/other
路径下寻找资源文件
- 由上可以看出:请求路径由
设置网站默认首页
index file;
设置网站的错误页面
- 一般来说2XX请求完成, 3XX代表网站重定向, 4XX客户端出错 ,5XX服务器出错
- Http错误
-
语法:
error_page code ...[=[response]] uri
- code代表错误码
- response,将code指定的错误代码转换为新的错误代码response
- uri,错误页面的路径或者网站地址
-
案例
error_page 404 /404.html
:页面找不到,报404错误,映射到404.html响应error_page 403 http://some.com/s.html
:设置nginx服务器使用指定路径的页面响应403错误error_page 410 =301 /empty.gif
:设置nginx服务器产生410的http消息时,使用nginx安装路径/html/empty.gif返回给用户端301消息
-
上面的页面的所有的返回路径都是基于nginx的安装目录来说的相对路径,如果想自定义路径,只需要另外使用一个location指令定向错误页面到新路径下就可以了
error_page 404 /404.html location /404.html{ root /myserver/myerror }
基于IP配置Nginx的访问权限
- 可在http,server,location中使用
-
allow address | CIDR | all
:设置允许访问Nginx的客户端IPCIDR
:允许访问的客户端的CIDR地址,例如202.80.18.23/25表示,前面是32位IP地址,后面/25表示该IP地址中前25位是网络部分,其余代表主机部分
-
deny address | CIDR | all
:设置禁止访问Nginx的客户端IPlocation /{ deny 192.168.1.1; allow 192.168.1.0/24; deny all; } #192.168.1.0是可以访问的,因为nginx配置在解析的过程中,遇到deny指令或者allow是按照顺序对当前客户端的链接进行访问权限检查的
基于密码配置Nginx的访问权限
-
auth_basic string|off
:用于开启或关闭该认证功能- string:开启认证,并配置验证时的指示信息..off关闭
auth_basic_user_file file
: 用于设置包含用户名和密码信息的文件路径- 明文加密:
htpasswd -c -d /vagrant/pass test
test是用户名,这是linux自带的工具,回车后,要求输入用户名对应的密码.
[root@myNginx ~]# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost; #访问的域名
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html; #nginx 的默认的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 /usr/share/nginx/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;
#}
}
[root@myNginx ~]#
- nginx安装以后就会作为centos的一个系统服务自动启动,用systemctl进行管理就可以
-
curl -v 可以查看请求和响应的头信息
- request 包括 请求行,请求头部,请求数据
- response 包括状态行,消息报头,响应正文
[root@myNginx html]# curl -v www.baidu.com * About to connect() to www.baidu.com port 80 (#0) * Trying 61.135.169.121... * Connected to www.baidu.com (61.135.169.121) port 80 (#0) > GET / HTTP/1.1 request请求方式 请求协议 > User-Agent: curl/7.29.0 request > Host: www.baidu.com > Accept: */* > < HTTP/1.1 200 OK response响应返回 < Accept-Ranges: bytes < Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform < Connection: Keep-Alive < Content-Length: 2381 < Content-Type: text/html < Date: Sat, 04 Aug 2018 06:32:44 GMT < Etag: "588604c4-94d" < Last-Modified: Mon, 23 Jan 2017 13:27:32 GMT < Pragma: no-cache < Server: bfe/1.0.8.18 < Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/ < <!DOCTYPE html> <!--STATUS OK--><html> ... </html> * Connection #0 to host www.baidu.com left intact [root@myNginx html]#
模块配置案例
nginx模块分:nginx官方模块和第三方模块
stub_status
-
nginx -V 中的
--with-http_stub_status_module
Nginx客户端的状态-
配置
语法: stub_status; 默认是没有配置的 Context:server-locaiton之间配置
-
在
/etc/nginx/conf.d/default.conf
里,server
下加入server{ ... location /qidia { stub_status; } ... }
- 检查正确性:
nginx -t -c /etc/nginx/nginx.conf
- 重加在:
nginx -s reload -c /etc/nginx/nginx.conf
- 检查正确性:
-
页面访问
ip/(location后的 /qidia)
:192.168.43.201/qidia
,显示如下Active connections: 1 #nginx当前活跃的连接数 server accepts handled requests 8 8 7 #nginx接受的握手的总次数,nginx处理的连接数,总请求数 : nginx接受的握手的总次数==nginx处理的连接数表示nginx没有丢失 #总共处理了8个连接 , 成功创建8次握手, 总共处理了7个请求 Reading: 0 Writing: 1 Waiting: 0 #reading — 读取客户端的连接数. #writing — 响应数据到客户端的数量 #waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.
-
random_index
-
nginx -V 中的
--with-http_random_index_module
目录中随机选择一个主页作为一个随机主页-
配置
语法:random_index on|off; 默认是关闭的 Context:location中
-
在
/etc/nginx/conf.d/default.conf
里,只能在location
中加入location / { random_index on; #开启random_index root /usr/share/nginx/html; #指定随机访问的页面的存放位置 #index index.html index.htm; #注释掉原有的index页面 }
- 检查重加在后,页面就会出现随机访问的效果
- 需要注意的是: linux中的隐藏文件就是以
.
开头的文件是不会作为随机页面作为访问的
-
sub
-
nginx -V 中的
--with-http_sub_module
HTTP内容替换-
配置
语法:sub_filter string replacement #string要替换的内容, replacement替换后的内容 默认不开 Context:http,server,lication #如果加载http下面可以完成对多个server的内容替换
语法:sub_filter_last_modified on|off; 默认关闭 Context:http,server,location
语法:sub_filter_once on|off; 默认开启 #on只匹配第一个.off会把html的全部内容都匹配一次 Context:http,server,location
-
在
/etc/nginx/conf.d/default.conf
里,如下location / { root /usr/share/nginx/html; index index.html index.htm; sub_filter 'nginx' 'qidai'; #将nginx替换成qidai sub_filter_once off; #全局替换 }
sub_filter_once
on 就只匹配第一,替换第一个
-