什么是nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务
nginx作用
正向代理

反向代理

简单来说:正向代理指的是代理的客户端,服务器不知道具体是谁请求的。反向代理指定是代理服务器,客户端不知道具体是哪一台服务器提供的服务
负载均衡
轮询

加权轮询

iphash:iphash对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题

动静分离:有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件,将静态资源文件放到nginx中,让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,提高资源响应速度

nginx配置文件详解
整体结构大致如下
nginx# 全局块 worker_processes 1; # events块 events { worker_connections 1024; } # http块 http { # http全局块 default_type application/octet-stream; # server块 server { # server全局块 listen 8000; server_name localhost; # location块 location / { root html; index index.html index.htm; } } # 其他server块 server { ... } }解释:nginx的主配置文件是nginx.conf,这个配置文件一共由三部分组成,分别为全局块、events块和http块,在http块中,又包含http全局块、多个server块,每个server块中,可以包含server全局块和多个location块,如果某个指令在两个不同层级的块中同时出现,则采用”就近原则”
全局块:全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响nginx服务器整体运行的配置指令,因此,这些指令的作用域是nginx服务器全局
具体指令
nginx# 指令:user [user] [group] # 定义: # 此指定可以运行nginx服务的用户和用户组 # 将user指令注释掉,或者配置成nobody的话所有用户都可以运行 # 作用范围:只能在全局块配置 # 示例: user nobody nobody; # 注意: # user指令在Windows上不生效,如果配置,会报错 nginx: [warn] "user" is not supported, ignored in D:\software\nginx-1.18.0/conf/nginx.conf:2 # 指令:worker_processes number | auto; # 定义:指定工作线程数,可以制定具体的进程数,也可使用自动模式 # 作用范围:只能在全局块配置 # 示例:这种情况下会生成一个master进程和4个worker进程 worker_processes 4; # 指令:pid 文件存放路径; # 定义: # 指定pid文件存放的路径 # pid文件是什么?pid文件是用来存储Nginx主进程号的文件,这个文件的存在确保了Nginx服务不会被多次启动,因为在启动时,Nginx会检查PID文件中记录的进程是否存在,如果存在,则不会重复启动服务 # 作用范围:只能在全局块配置 # 示例: pid logs/nginx.pid; # 指令:error_log [path] [debug | info | notice | warn | error | crit | alert | emerg] # 定义:指定错误日志的路径和日志级别 # 作用范围:可以在全局块、http块、server块以及location块中配置 # 注意: # debug级别的日志需要编译nginx时使用--with-debug开启debug开关 # 具体编译命令:./configure --with-debug # 示例: error_log logs/error.log info;
events块:events块涉及的指令主要影响Nginx服务器与用户的网络连接,这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整
具体指令
nginx# 指令:accept_mutex on | off; # 定义:是否对多个nginx进程接收网络连接进行序列化,开启的话可以防止多个进程对连接的争抢 # 作用范围:只能在events块中配置 # 默认值:on # 示例: accept_mutex off; # 指令:multi_accept on | off; # 定义:规定nginx一个工作线程是否只能同时接收一个新的网络连接 # 作用范围:只能在events块中配置 # 默认值:off # 注意:如果nginx使用kqueue连接方法,此指令会被忽略 # 示例: multi_accept on; # 指令: # use method; # use 具体的连接处理方法; # 定义:nginx支持多种连接处理方法。特定方法的可用性取决于所使用的平台。在支持多种方法的平台上,nginx通常会自动选择最高效的方法。但是如果需要,可以使用use指令明确选择连接处理方法 # 作用范围:只能在events块中配置 # 可选内容: # select:标准方法,支持模块自动构建在缺乏更有效方法的平台上,--with-select_module和--without-select_module配置参数可以用来强制地启用或禁用该模块的版本 # poll:标准方法,支持模块自动构建在缺乏更有效方法的平台上,--with-poll_module和--without-poll_module配置参数可以用来强制地启用或禁用该模块的版本 # kqueue:在FreeBSD 4.1+,OpenBSD 2.9+,NetBSD 2.0和macOS上使用的有效方法 # epoll:在Linux 2.6+上使用的有效方法 # /dev/poll:在Solaris 7 11/99 +,HP / UX 11.22+(eventport),IRIX 6.5.15+和Tru64 UNIX 5.1A +上使用的高效方法 # eventport:事件端口,在Solaris 10+上使用的/dev/poll方法(由于已知问题,建议使用该方法) # 示例: use method; use epoll; # 指令:worker_connections number; # 定义: # 设置允许每一个worker process同时开启的最大连接数,当每个工作进程接受的连接数超过这个值时将不再接收连接 # 当所有的工作进程都接收满时,连接进入logback,logback满后连接被拒绝 # 作用范围:只能在events块中配置 # 注意:这个值不能超过超过系统支持打开的最大文件数,也不能超过单个进程支持打开的最大文件数 # 示例: worker_connections 1024;
http块:代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中
全局块
nginx# 指令:include # 指令:default_type 文件类型; # 定义:指定用户访问文件时的类型 # 作用范围:可以在http全局块、server块、location块中配置 # 默认值:text/plain(纯文本) # 示例:指定用户访问文件时,浏览器自动弹出下载窗口 default_type application/octet-stream; # 指令:access_log 文件存放路径; # 定义:记录谁访问了你的网站 # 作用范围:可以在http全局块、server块、location块中配置 # 示例: access_log /var/log/nginx/access.log; # 注意:如果某些页面没必要记录日志,可以在location中具体关闭 location /test { access_log off; } # 指令:log_format 日志格式变量名 日志格式; # 定义:用于定义日志格式,并给该格式取名,定义完毕后就可以中access_log使用了 # 作用范围:只能在http全局块中配置 # 示例: log_format customLogFormat '$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 customLogFormat; # 指令:sendfile on | off # 定义:让nginx用高效方式发送大文件,这样下载速度更快、服务器压力更小 # 作用范围:可以在http全局块、server块、location块中配置 # 示例: sendfile on; # 指令:sendfile_max_chunk size; # 定义:设置sendfile最大数据量,防止带宽被某人瞬间用光 # 默认值:0,无限制 # 作用范围:可以在http全局块、server块、location块中配置 # 示例: sendfile_max_chunk 128k; # 指令:keepalive_timeout timeout [header_timeout] # 定义:设置连接保持时间,就是用户和服务器之间的通道保持多久不关闭 # 作用范围:可以在http全局块、server块、location块中配置 # 可选内容 # timeout:连接保持时间,默认值75s # header_timeout:在应答报文头部的Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout” # 示例:服务器通道最多保持120秒,告诉浏览器100秒后可以断开 keepalive_timeout 120s 100s; # 指令:keepalive_requests number; # 定义:限制一个连接能发多少次请求,防止有人用一个连接发太多请求,用于接口防刷 # 作用范围:可以在http全局块、server块、location块中配置 # 示例:每个连接最多200次请求,超过就断开让他重连 keepalive_requests 200;server块
全局块
nginx# 指令: # 写法一:listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; # 写法二:listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; # 写法三(不常用):listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; # 定义:用于指定服务器监听的地址和端口的指令,也就是说告诉nginx哪个IP、哪个端口等待用户访问 # 参数说明 # default_server:设定为默认虚拟主机,当用户访问时,如果没有其他server块匹配,就用这个 # ssl:开启HTTPS # http2 | spdy:开启HTTP/2 或 SPDY 协议,提高速度和性能(spdy已废弃) # proxy_protocol:允许从反向代理获取客户端真实IP等信息 # setfib=number:FreeBSD系统专用,指定FIB路由表编号 # fastopen=number:TCP Fast Open,减少连接建立延迟 # backlog=number:连接等待队列的最大长度,高并发网站可以适当调大 # rcvbuf=size / sndbuf=size:分别设置接收和发送缓冲区大小 # accept_filter=filter:FreeBSD/NetBSD专用,优化连接的接收过程 # deferred:延迟接收连接直到有数据可读 # bind:强制绑定到指定IP,多IP服务器时,确保只监听指定IP # ipv6only=on | off:只监听IPV6的地址,或同时监听IPV4 # reuseport:支持多个进程同时监听同一端口,提高并发性能 # so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]:设置TCP连接的长连接参数,需要长时间保持连接的服务时会用到这个参数 # unix:path:监听本地Unix域套接字(非网络端口),比如与本地PHP-FPM通信 # 示例: listen 127.0.0.1:8000; # 只监听来自127.0.0.1这个IP并且请求8000端口的请求 listen 127.0.0.1; # 只监听来自127.0.0.1这个IP并且请求80端口的请求(不指定端口,默认80) listen 8000; # 监听来自所有IP并且请求8000端口的请求 listen *:8000; # 和上面效果一样 # 指令:server_name name ...; # 定义:用于配置虚拟主机的名称,可以配置一个,也可以配置多个,中间用空格隔开,每个名字就是一个域名 # 注意: # 如果配置多个,nginx规定第一个名称作为此虚拟主机的主要名称 # name中也可以使用通配符,但是通配符只能作用在由三段字符串组成的域名的首段或尾段 或者 由两段字符串组成的名称的尾段,具体使用请看示例 H# nginx规定,按照以下优先级选择虚拟主机 准确匹配server_name > 通配符在开始时匹配成功 > 通配符在结尾时匹配成功 > 正则表达式匹配成功,如果两个server的优先级相同,那么由首次匹配成功的虚拟主机处理请求 # 示例: server_name www.qnmdmyy.top; server_name aaa.qnmdmyy.top www.qnmdmyy.top; server_name *.qnmdmyy.top www.qnmdmyy.* qnmdmyy.*;location块:地址定向、数据缓存和应答控制等功能都是在这部分实现
location块的语法结构
nginxlocation [ = | ~ | ~* | ^~ ] uri { # 具体指令 } # 解释: # uri变量是待匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php等;也可以是包含有正则表达的字符串,如 .php$(表示以.php结尾的URL)等 # 在不添加此选项时,Nginx服务器首先在server块的多个location块中搜索是否有不含正则表达式的uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求;如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。 # 方括号里的部分,是可选项,用来改变请求字符串与 uri 的匹配方式,各项的含义如下 # “=”,用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求。 # “^~”,用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。 # “~”,用于表示uri包含正则表达式,并且区分大小写。 # “~*”,用于表示uri包含正则表达式,并且不区分大小写。注意如果uri包含正则表达式,就必须要使用“~”或者“~*”标识。location块内的指令
nginx# 指令:proxy_pass path; # 定义:将请求转发到后端服务器 # 作用范围:只能作用在location块中 # 示例: location /api/ { proxy_pass http://backend_server; } # 指令:root path; # 定义:定义该location块下文件的根目录 # 作用范围:可以在http全局块、server块、location块中配置 # 示例: location /images/ { root /var/images; } # 指令:index xxx.html | xxx.htm | ...; # 定义:指定默认文档,当访问目录时,自动返回指定的文件 # 作用范围:可以在http全局块、server块、location块中配置 # 示例: location / { index index.html; } # 指令:try_files ; # 定义:这个指令用于尝试按顺序查找文件,以确定如何处理请求 # 作用范围: # 示例: location / { try_files $uri $uri/ /index.html; } # 示例说明: # $uri:代表请求的 URI,例如 /about # $uri/:如果 $uri 不是一个文件,Nginx 会检查它是否为一个目录。如果是目录,则会查找该目录下的文件 # /index.html:如果前面的两个都没有找到,Nginx 会转发请求到 /index.html # 指令:rewrite ; # 定义:用于重写请求的 URI # 作用范围: # 示例: location /old-path { rewrite ^/old-path/(.*)$ /new-path/$1 permanent; } # 示例说明: # ^/old-path/(.*)$:这是一个正则表达式,表示匹配以 /old-path/ 开头的 URI,(.*) 捕获该部分后面的所有内容 # /new-path/$1:重写后的新 URI,其中 $1 是正则表达式中 (.*) 捕获的内容。也就是说,如果请求是 /old-path/example,它会变成 /new-path/example # permanent:指示浏览器进行永久重定向(HTTP 301)。这意味着搜索引擎和浏览器会缓存这个重定向 # 指令:expires timeout; # 定义:设置浏览器缓存的过期时间 # 作用范围:可以在http全局块、server块、location块中配置 # 示例: location /static/ { expires 30d; # 缓存30天 } # 指令:add_header content; # 定义:添加自定义HTTP响应头,例如添加CSP(内容安全政策)头 # 作用范围:可以在http全局块、server块、location块中配置 # 示例: location /secure/ { add_header Content-Security-Policy "default-src 'self'"; } # 指令:deny/allow ip; # 定义:限制特定IP地址或范围的访问 # 作用范围:可以在http全局块、server块、location块中配置 # 示例: location /admin/ { allow 192.168.1.0/24; # 只允许内网访问 deny all; # 拒绝其他所有访问 } # 指令:error_page 状态码 页面; # 定义:自定义处理常见的HTTP错误(如 404, 500)的处理页面 # 作用范围: # 示例:可以在http全局块、server块、location块中配置 location / { error_page 404 /404.html; }
相关工具
参考文档