Loading
0

精简实用最全的Nginx学习资料(安装,伪静态,负载均衡,正反向代理,正则语法)

技术小学生微信公众号
腾讯云服务器大促销。
华为服务器

前言:闲来无事,互联网一顿乱逛,发现了一个好东西,关于Nginx最全的学习资料,涵盖了Nginx,Nginx安装,Nginx启动配置,Nginx伪静态配置,Nginx语法讲解,Nginx正则匹配,Nginx location学习,Nginx反向代理,Nginx正向代理,Nginx负载均衡配置,Nginx缓存配置方法,Nginx动静分离,Nginx双击主备搭建,NginxHTTPS部署,Nginx压缩配置,Nginx跨域配置,nginx虚拟主机配置的全面学习、精简实用,希望对大家有帮助啊
阅读导航:
  1. Nginx的安装
  2. 基本配置
  3. Nginx访问设置
  4. Nginx虚拟主机配置
  5. location匹配规则详解
  6. alias、root等常见配置指令
  7. Nginx的Rewrite(伪静态)
  8. Nginx代理实践
  9. 负载均衡
  10. Nginx缓存
  11. 动静分离
  12. Nginx跨域
  13. Gzip压缩
  14. Nginx的https配置
  15. Nginx配置UDP/TCP代理
  16. Nginx双机贮备构架搭建实战

内容太多,建议直接下载PDF文档阅读
Nginx最全学习资料.pdf
1b5a5eab6faa71291514461e7fbe1a7d.pdf

Nginx的安装
1、下载Nginx

wget http://nginx.org/download/nginx-1.14.2.tar.gz (stable)

2、安装Nginx依赖
nginx是C语言开发,建议在linux上运行,本教程使用Centos7.4为安装环境。

yum install -y gcc-gcc++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

3、解压安装Nginx
解压

tar xf nginx-1.14.2.tar.gz

进行configure配置

./configure --prefix=/usr/local/nginx (可以配置很多nginx其他模块,后面配置https的时候讲解)

编译和安装

make & make install -j 4

如果以上操作没有报错则安装成功
启动nginx
./nginx -c 指定配置文件位置

eg: ./nginx -c /usr/local/conf/nginx.conf

./nginx 默认使用NGINX_HOME/config/nginx.conf配置文件
停止niginx

./nginx -s stop 停止
./nginx -s quit 退出
./nginx -s reload 重新加载nginx.conf (很常用)

发送信号量 (找不到nginx安装位置,但是想要停止nginx服务器情况下使用)

kill -TERM master进程号
kill -QUIT master进程号

4、nginx 常用命令

./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、基本结构

// nginx全局块
...
// events块
events {
...
}
// http 块
http {
// http全局块
...
// server块
server {
...
}
// http全局块
...
}
// upstream 块
upstream {
}

2、配置文件详解
2.1 nginx.conf配置文件

# 配置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/*;
}

3、Nginx 日志介绍
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 当级别高于或等于指定级别时才会记录
3.2 access_log
  • 记录请求通过的日志
  • 作用域为 http server location limit_except
  • 日志格式默认为 combined
  • 日志格式是可以自定义的

# 定义一个为 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;

上方的 log_format 后面类似 $remote_addr 是nginx的内置变量,取值如下

$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”

vim /etc/nginx/conf.d/default.conf

error_page指令用于设置错误页面,如下图所示。500、502、503、504这些是常见的HTTP的错误代码,/50x.html
用于当发生上述指定的任意一个错误的时候,使用网站根目录下的/50x.html进行处理。这里通过location =
/50x.html进行匹配,最终用户看到的错误页面为 “/usr/share/nginx/html” 目录下的 50x.html页面。
设置格式:error_page ...

2、权限指令deny和allow
deny,设置禁止访问的IP

#禁止IP:192.168.6.101访问
location / {
deny 192.168.6.101;
}
#禁止所有IP访问
location / {
deny all;
}

allow,设置允许访问的IP

#只允许IP:192.168.6.101访问
location / {
allow 192.168.6.101;
}
#允许所有IP访问
location / {
allow all;
}

deny和allow的优先级
nginx的权限指令是从上往下执行的,在同一个块下deny和allow指令同时存在时,谁先匹配谁就会起作用,后面的
权限指令就不会执行了。如下图,如果 “deny 111.111.111.111” 触发了,那它后面的两条都不会触发。

location / {
deny 192.168.6.101;
allow 192.168.6.220;
deny 192.168.6.221;
}

其实他们的关系就像 “if...else if...else if”,谁先触发,谁起作用。

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段

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;
}
}

2、基于端口号的虚拟主机配置
1、在nginx.conf文件中配置server段

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;
}
}

3、基于IP的虚拟主机配置
1、添加网卡的IP别名

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

从另外一台服务器Ping 192.168.3.202和192.168.3.203两个IP,如果能够Ping通,则证明配置无误。但是,通过
ifconfig和route配置的IP别名在服 务器重启后会消失,不过可以将这两条ifconng和route命令添加到/etc/rc.local文
件中,让系统开机时自动运行,以下是相关命令:vi /etc/rc.local
在文件末尾增加以下内容,然后保存即可

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

2、修改配置文件做如下的Server段配置

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;
}
}

location匹配规则详解
语法规则:

# = 开头表示精准匹配
# ~ 大小写敏感# ~* 忽略大小写
# ^~ 只需匹配uri开头
# @ 定义一个命名的 location,在内部定向时使用,例如 error_page
location [ = | ~ | ~* | ^~ ] /uri/ { ... }
location @name { ... }

1、 任意匹配

# 匹配所有请求,但是正则和最长字符串会优先匹配
location / {
#规则
}

2、“=” 精准匹配

# 精确匹配 / ,可以匹配类似 `http://www.example.com/` 这种请求,'/'后不能带有任何内容
location = / {
#规则
}

3、“~” 大小写敏感

location ~ /Test/ {
#规则
}
#可以匹配 http://www.test.com/Test/
#不可以匹配 http://www.test.com/test/

4、 “~*” 大小写忽略

# ~* 会忽略uri部分的大小写
location ~* /Test/ {
#规则
}
#可以匹配 http://www.test.com/test/

5、 “^~” 只匹配uri开头

#以 /test/ 开头的请求,都可以匹配上
location ^~ /test/ { #规则
}
#可以匹配 http://www.test.com/test/

6、“@” 命名匹配

#以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
location /img/ {
error_page 404 @img_err;
}
location @img_err {
# 规则
}

7、以内容结尾匹配

# 匹配所有以 gif,jpg或jpeg 结尾的请求
location ~* \.(gif|jpg|jpeg)$ {
#规则
}

8、location匹配优先级
在配置中需要注意的一点就是location的匹配规则和优先级
  • = 开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,不是正则匹配;
  • ~ 开头表示区分大小写的正则匹配;
  • ~* 开头表示不区分大小写的正则匹配;
  • / 通用匹配, 如果没有其它匹配,任何请求都会匹配到;
9、location的匹配流程
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配置的位置无关。


























































 
技术小学生微信公众号
华为服务器
腾讯云服务器大促销。

声明:站长码字很辛苦啊,转载时请保留本声明及附带文章链接:https://blog.tag.gg/showinfo-7-36218-0.html
亲爱的:若该文章解决了您的问题,可否收藏+评论+分享呢?
上一篇:Nginx禁止部分网站做防盗链设置以及跳转到指定地方
下一篇:解决Nginx“The plain HTTP request was sent to HTTPS port”报错方法