阅读导航:
- Nginx的安装
- 基本配置
- Nginx访问设置
- Nginx虚拟主机配置
- location匹配规则详解
- alias、root等常见配置指令
- Nginx的Rewrite(伪静态)
- Nginx代理实践
- 负载均衡
- Nginx缓存
- 动静分离
- Nginx跨域
- Gzip压缩
- Nginx的https配置
- Nginx配置UDP/TCP代理
- Nginx双机贮备构架搭建实战
内容太多,建议直接下载PDF文档阅读
Nginx的安装
1、下载Nginx
2、安装Nginx依赖wget http://nginx.org/download/nginx-1.14.2.tar.gz (stable)
nginx是C语言开发,建议在linux上运行,本教程使用Centos7.4为安装环境。
3、解压安装Nginxyum install -y gcc-gcc++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
解压
进行configure配置tar xf nginx-1.14.2.tar.gz
编译和安装./configure --prefix=/usr/local/nginx (可以配置很多nginx其他模块,后面配置https的时候讲解)
如果以上操作没有报错则安装成功make & make install -j 4
启动nginx
./nginx -c 指定配置文件位置
./nginx 默认使用NGINX_HOME/config/nginx.conf配置文件eg: ./nginx -c /usr/local/conf/nginx.conf
停止niginx
发送信号量 (找不到nginx安装位置,但是想要停止nginx服务器情况下使用)./nginx -s stop 停止
./nginx -s quit 退出
./nginx -s reload 重新加载nginx.conf (很常用)
4、nginx 常用命令kill -TERM master进程号
kill -QUIT master进程号
./nginx -v 查看nginx版本
./nginx -V 查看nginx的编译版本及配置的参数
./nginx -t 主要验证nginx.conf配置文件是否有问题
./nginx -c 根据配置文件的位置启动nginx
./nginx -s 发送对应信号处理master进程
-s signal : send signal to a master process: stop, quit, reopen, reload
基本配置文件
1、基本结构
2、配置文件详解// nginx全局块
...
// events块
events {
...
}
// http 块
http {
// http全局块
...
// server块
server {
...
}
// http全局块
...
}
// upstream 块
upstream {
}
2.1 nginx.conf配置文件
3、Nginx 日志介绍# 配置nginx的用户组 默认为nobody
#user nobody;
#指定工作进程的个数,默认是1个,具体可以根据服务器cpu数量进行设置,如果不知道cpu的数量,可以设置为auto
worker_processes 1;
# 配置nginx的错误日志 格式为 log路径 log级别
# error_log 的日志级别为: debug info notice warn error crit alert emerg 紧急由低到高
# error_log的默认日志级别为error,那么就只有紧急程度大于等于error的才会记录在日志
# error_log 的作用域为 main http mail stream server location
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 指定nginx进程运行文件存放地址
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#参考事件模型,use [ select | poll | kqueue | epoll | rtsig | /dev/poll | eventport ]
# poll是多路复用IO中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
# use epoll
# 设置网络的连接序列化 防止惊群现象发生 默认为 on
# accept_mutex on;
# 设置一个进程是否同时接受多个网络连接 默认为 off
# multi_accept off
# 最大连接数 默认为 512
worker_connections 1024;
#######################################################################
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适
当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
}
http {
# 文件扩展名和文件类型映射表
include 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 logs/access.log main;
# sendfile 指定使用 sendfile 系统调用来传输文件。优点在于在两个文件描述符之间传递数据(完全在内核中
操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,效率高,称之为零拷贝
# sendfile 作用域 location server http
sendfile on;
#减少网络报文段的数量
#tcp_nopush on;
# 链接超时时间 默认 75s 作用域 http server location
#keepalive_timeout 0;
keepalive_timeout 65;
# 开始gzip压缩,降低带宽使用和加快传输速度,但增加了CPU的使用
#gzip on;
server {
# 端口号
listen 8080;
# 域名或ip
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 对请求的路由进行过滤 正则匹配
location / {
root html;
index index.html index.htm;
}
...
}
include servers/*;
}
nginx的日志大致分为 access_log 和 error_log 。error_log 记录的是nginx的错误日志。(以下对日志的理解不
是很全面,还只是基础的)
3.1 error_log
- 记录nginx错误日志
- 作用域为 main http mail stream server location
- 日志级别 debug info notice warn error crit alert emerg
- 日志级别默认为 error 当级别高于或等于指定级别时才会记录
- 记录请求通过的日志
- 作用域为 http server location limit_except
- 日志格式默认为 combined
- 日志格式是可以自定义的
上方的 log_format 后面类似 $remote_addr 是nginx的内置变量,取值如下# 定义一个为 main 的日志格式
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;
$remote_addr, $http_x_forwarded_for(反向) 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里
的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客
户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。
Nginx访问设置
1、设置错误页面
打开nginx子默认配置文件 “default.conf”
error_page指令用于设置错误页面,如下图所示。500、502、503、504这些是常见的HTTP的错误代码,/50x.htmlvim /etc/nginx/conf.d/default.conf
用于当发生上述指定的任意一个错误的时候,使用网站根目录下的/50x.html进行处理。这里通过location =
/50x.html进行匹配,最终用户看到的错误页面为 “/usr/share/nginx/html” 目录下的 50x.html页面。
设置格式:error_page ... 2、权限指令deny和allow
deny,设置禁止访问的IP
allow,设置允许访问的IP#禁止IP:192.168.6.101访问
location / {
deny 192.168.6.101;
}
#禁止所有IP访问
location / {
deny all;
}
deny和allow的优先级#只允许IP:192.168.6.101访问
location / {
allow 192.168.6.101;
}
#允许所有IP访问
location / {
allow all;
}
nginx的权限指令是从上往下执行的,在同一个块下deny和allow指令同时存在时,谁先匹配谁就会起作用,后面的
权限指令就不会执行了。如下图,如果 “deny 111.111.111.111” 触发了,那它后面的两条都不会触发。
其实他们的关系就像 “if...else if...else if”,谁先触发,谁起作用。location / {
deny 192.168.6.101;
allow 192.168.6.220;
deny 192.168.6.221;
}
if (deny 192.168.6.101) {...}
else if (allow 192.168.6.220) {...}
else if (deny 192.168.6.221) {...}
Nginx虚拟主机配置
1、基于域名的虚拟主机配置
1、修改宿主机的hosts文件(系统盘/windows/system32/driver/etc/HOSTS)
linux : vim /etc/hosts
格式: ip地址 域名
eg: 192.168.3.172 www.gerry.com
2、在nginx.conf文件中配置server段
2、基于端口号的虚拟主机配置server {
listen 80;
server_name www.gerry.com; # 域名区分
location / {
root html/gerry;
index index-1.html;
}
}
server {
listen 80;
server_name www.mmren.com; # 域名区分
location / {
root html/gerry;
index index-2.html;
}
}
1、在nginx.conf文件中配置server段
3、基于IP的虚拟主机配置server {
listen 80; # 端口区分
server_name www.gerry.com;
location / {
root html/gerry;
index index.html;
}
}
server {
listen 8080; # 端口区分
server_name www.gerry.com;
location / {
root html/gerry;
index index.html;
}
}
1、添加网卡的IP别名
从另外一台服务器Ping 192.168.3.202和192.168.3.203两个IP,如果能够Ping通,则证明配置无误。但是,通过ifconfig ens33:1 192.168.3.202 broadcast 192.168.3.255 netmask 255.255.255.0 up
route add -host 192.168.3.202 dev ens33:1
ifconfig ens33:2 192.168.3.203 broadcast 192.168.3.255 netmask 255.255.255.0 up
route add -host 192.168.3.203 dev ens33:2
ifconfig和route配置的IP别名在服 务器重启后会消失,不过可以将这两条ifconng和route命令添加到/etc/rc.local文
件中,让系统开机时自动运行,以下是相关命令:vi /etc/rc.local
在文件末尾增加以下内容,然后保存即可
2、修改配置文件做如下的Server段配置ifconfig ens33:1 192.168.3.202 broadcast 192.168.3.255 netmask 255.255.255.0 up
route add -host 192.168.3.202 dev ens33:1
ifconfig ens33:2 192.168.3.203 broadcast 192.168.3.255 netmask 255.255.255.0 up
route add -host 192.168.3.203 dev ens33:2
location匹配规则详解server {
listen 80;
server_name 192.168.3.202;
location / {
root html/host1;
index index.html;
}
}
server {
listen 80;
server_name 192.168.3.203;
location / {
root html/host2;
index index.html;
}
}
语法规则:
1、 任意匹配# = 开头表示精准匹配
# ~ 大小写敏感# ~* 忽略大小写
# ^~ 只需匹配uri开头
# @ 定义一个命名的 location,在内部定向时使用,例如 error_page
location [ = | ~ | ~* | ^~ ] /uri/ { ... }
location @name { ... }
2、“=” 精准匹配# 匹配所有请求,但是正则和最长字符串会优先匹配
location / {
#规则
}
3、“~” 大小写敏感# 精确匹配 / ,可以匹配类似 `http://www.example.com/` 这种请求,'/'后不能带有任何内容
location = / {
#规则
}
4、 “~*” 大小写忽略location ~ /Test/ {
#规则
}
#可以匹配 http://www.test.com/Test/
#不可以匹配 http://www.test.com/test/
5、 “^~” 只匹配uri开头# ~* 会忽略uri部分的大小写
location ~* /Test/ {
#规则
}
#可以匹配 http://www.test.com/test/
6、“@” 命名匹配#以 /test/ 开头的请求,都可以匹配上
location ^~ /test/ { #规则
}
#可以匹配 http://www.test.com/test/
7、以内容结尾匹配#以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
location /img/ {
error_page 404 @img_err;
}
location @img_err {
# 规则
}
8、location匹配优先级# 匹配所有以 gif,jpg或jpeg 结尾的请求
location ~* \.(gif|jpg|jpeg)$ {
#规则
}
在配置中需要注意的一点就是location的匹配规则和优先级
- = 开头表示精确匹配
- ^~ 开头表示uri以某个常规字符串开头,不是正则匹配;
- ~ 开头表示区分大小写的正则匹配;
- ~* 开头表示不区分大小写的正则匹配;
- / 通用匹配, 如果没有其它匹配,任何请求都会匹配到;
A、判断是否精准匹配,如果匹配,直接返回结果并结束搜索匹配过程。
B、判断是否普通匹配,如果匹配,看是否包含^~前缀,包含则返回,否则记录匹配结果,(如果匹配到多个location
时返回或记录最长匹配的那个)
C、判断是否正则匹配,按配置文件里的正则表达式的顺序,由上到下开始匹配,一旦匹配成功,直接返回结果,并
结束搜索匹配过程。
D、如果正则匹配没有匹配到结果,则返回步骤B记录的匹配结果。
注意:
A、多个普通匹配的location时,和location的顺序无关,总是匹配所有的location,然后取匹配最长的location作为
结果
B、多个正则匹配的location时,和顺序有关,从上到下依次匹配,一旦匹配成功便结束,直接返回结果
常见的location路径映射路径有以下几种:
-
=
进行普通字符精确匹配。也就是完全匹配。 -
^~
前缀匹配。如果匹配成功,则不再匹配其他location。 -
~
表示执行一个正则匹配,区分大小写 -
~*
表示执行一个正则匹配,不区分大小写 -
/xxx/
常规字符串路径匹配 -
/
通用匹配,任何请求都会匹配到
location优先级
当一个路径匹配多个location时究竟哪个location能匹配到时有优先级顺序的,而优先级的顺序于location值的表达式类型有关,和在配置文件中的先后顺序无关。相同类型的表达式,字符串长的会优先匹配
以下是按优先级排列说明:
-
等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项,停止搜索。 -
^~
类型表达式,不属于正则表达式。一旦匹配成功,则不再查找其他匹配项,停止搜索。 -
正则表达式类型( ~ ~*
)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。 -
常规字符串匹配类型。按前缀匹配。 -
/ 通用匹配,如果没有匹配到,就匹配通用的
优先级搜索问题:不同类型的location映射决定是否继续向下搜索
-
等号类型、 ^~
类型:一旦匹配上就停止搜索了,不会再匹配其他location了 -
正则表达式类型( ~ ~*
),常规字符串匹配类型/xxx/
: 匹配到之后,还会继续搜索其他其它location,直到找到优先级最高的,或者找到第一种情况而停止搜索
location优先级从高到底:
(location =
) > (location 完整路径
) > (location ^~ 路径
) > (location ~,~* 正则顺序
) > (location 部分起始路径
) > (/
)
location = / {
# 精确匹配/,主机名后面不能带任何字符串 /
[ configuration A ]
}
location / {
# 匹配所有以 / 开头的请求。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration B ]
}
location /documents/ {
# 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。
# 但是如果有更长的同类型的表达式,则选择更长的表达式。
# 如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration C ]
}
location ^~ /images/ {
# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
# 所以,即便有符合的正则表达式location,也不会被使用
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif jpg jpeg结尾的请求。
# 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,还会继续往下搜索
[ configuration F ]
}
location = /test.htm {
root /usr/local/var/www/htm;
index index.htm;
}
注意:location的优先级与location配置的位置无关。
文章评论 本文章有个评论