Nginx应用场景详解
一、Nginx简介
官网地址:https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/
1.1 Nginx正向代理
概念:位于客户端和原始服务器之间的服务器,为了从原始服务器获取数据,客户端向代理服务器发送请求并指定请求目标(原始服务器),然后代理服务器将请求转换给原始服务器,并将响应的数据返回给客户端。
【注】正向代理的代理对象是客户端。常见作用如下:
(1)访问原来无法访问的资源(google、fackbook等),翻墙。
(2)可以做缓存,加速资源的访问。
(3)对客户端上网进行认证授权。
(4)上网行为管理,记录用户访问记录,对外隐藏用户信息。
1.2 反向代理
概念:客户端发送请求到服务器(客户端认为是原始服务器,实际上是一台反向服务器),反向代理服务器接收请求并将请求转发给内部网络中的多台集群服务器,并将响应的数据返回给客户端反向代理一般用于服务器集群、分布式等,实现负载均衡。
【注】反向代理的代理对象是服务端。常见作用如下:
(1)负载均衡,提高处理和响应速度。
(2)保证内网的安全,隐藏服务器信息,防止Web攻击。
1.3 nginx虚拟主机
1. 虚拟主机可以将一台服务器分成多个虚拟主机,每个虚拟主机可以独立对外提供 web服务。 2. Nginx 支持三种类型的虚拟主机配置 (1)基于IP的虚拟主机 (2)基于域名的虚拟主机 (3)基于端口的虚拟主机
二、正/反向代理配置
2.1 正向代理
配置代理服务器,实现国内正常访问google资源。
[root@10-27-0-224 ~]# yum install nginx -y [root@10-27-0-224 ~]# vim /etc/nginx/conf.d/google.conf server { listen 80; server_name starcto.com; resolver 8.8.8.8; location / { root html; index index.html index.htm; proxy_pass https://www.google.com; proxy_connect_timeout 120; proxy_read_timeout 600; proxy_send_timeout 600; send_timeout 600; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
2.2 反向代理/负载均衡
(1)反向代理
[root@10-27-0-224 ~]# vim web-1.conf http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name starcto.com; location / { proxy_pass http://10.27.0.224:9000; # 访问starcto.com(没域名可以host配置)会跳转下面的请求 index index.html index.htm; } } }
(2)负载均衡
[root@10-27-0-224 ~]# vim web-2.conf upstream web_server{ server 10.27.0.224:8081 weight=3; #weight表示权重,权重越高被分配到的几率越大 server 10.27.0.224:8082 weight=7; } server{ listen 80; server_name www.starcto.com; location / { proxy_pass http://web_server; #指定代理的后台服务器 } }
2.3 虚拟主机
[root@10-27-0-224 ~]# vim web.conf #1. nginx全局配置 #user nobody; # user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行 worker_processes 1; # 启动进程数,根据你的电脑CPU数,1个,4个或8个 #error_log logs/error.log; # error_log是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少 #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; # pid是主模块指令,用来指定进程id的存储文件位置 worker_rlimit_nofile 65535; # 指定一个nginx进程可以打开的最多文件描述符数目,需要使用命令“ulimit -n 65535”来设置。 #(1)use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。 #(2)worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections,在作为反向代理时,max_clients变为:max_clients = worker_processes * worker_connections/4。 #(3)进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。 events { # 设定Nginx的工作模式及连接数上限。 worker_connections 1024; # 连接数上限 } #2. HTTP服务器配置 http { # 处理http请求的一个应用配置段 include mime.types; # 引用mime.types,这个类型定义了很多,当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,根据MIME TYPE设置并response响应类型(Content-type)。 default_type application/octet-stream; #远程ip – 远程用户/用户时间 请求方法(get/post) 状态 请求body长度 referer来源信息 http-user-agent 用户代理 被转发的原始请求IP,由这些属性组成日志格式。 #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。 # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; client_max_body_size 20m; # 设置允许客户端请求的最大的单个文件字节数。 client_header_buffer_size 32K; # 指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K。 large_client_header_buffers 4 32k;# 指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K。 # 参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。 sendfile on; # 指定NGINX是否调用这个函数来输出文件,对于普通的文件我们必须设置为ON,如果NGINX专门做为一个下载端的话可以关掉,好处是降低磁盘与网络的IO处理数及系统的UPTIME。 #tcp_nopush on; # 防止网络阻塞 #tcp_nodelay on; # 提高数据的实时响应性 #autoindex on; # 开启目录列表访问,适合下载服务器 keepalive_timeout 65; # 根据实际情况设置值,超时时间,客户端到服务端的连接持续有效时间,60秒内可避免重新建立连接,时间也不能设太长,太长的话,若请求数10000,都占用连接会把服务托死。 client_header_timeout 10; # 设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误。 client_body_timeout 10; # 设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60。 send_timeout 10; # 指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。 #3. HttpGzip模块配置 #gzip on; # 设置开启或者关闭gzip模块,"gzip on"表示开启GZIP压缩,实时压缩输出数据流。比如我的静态资源有10M,压缩后只有2M,那么浏览器下载的就少了。 #gzip_min_length 1k; # 设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字节数,小于1K可能会越压越大。 #gzip_buffers 4 16k; # 表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果 #gzip_http_version 1.1; # 设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。 #gzip_comp_level 2; # 用来指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源。 #gzip_types text/plain application/x-javascript text/css application/xml; # 用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。 #gzip_vary on; # 选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据。 #(1)基于域名虚拟主机 server { listen 80; # listen用于指定虚拟主机的服务端口 server_name starcto.com; # 用来指定IP地址或者域名,多个域名之间用空格分开 #charset gb2312; # Charset用于设置网页的默认编码格式 #access_log logs/wwwstarcto.access.log main; # access_log用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。 location / { # 用于设定访问的默认首页地址,root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径 root /usr/share/nginx/wwwroot/html; index index.html index.htm; # 指定欢迎页面,按从左到右顺序查找 } } # 使用 root 指令指定虚拟主机目录即网页存放目录 # 比如访问 http://ip/index.html 将找到 /usr/local/docker/nginx/wwwroot/html80/index.html # 比如访问 http://ip/item/index.html 将找到 /usr/local/docker/nginx/wwwroot/html80/item/index.html #(2)基于IP虚拟主机 server { listen 8080; server_name 10.27.0.224; location / { root /usr/share/nginx/wwwroot/html8080; index index.html index.htm; } } #(3)基于端口虚拟主机 server { listen 8888; location / { root /usr/share/nginx/wwwroot/html8888; index index.html index.htm; } error_page 404 /404.html; # 设置了虚拟主机的错误信息返回页面,通过error_page指令可以定制各种错误信息的返回页面 location = /404.html { # 特别需要注意的是,这些错误信息的返回页面大小一定要超过512K } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
(1)常见mime.types
text/html html htm shtml; text/css css; text/xml xml rss; image/gif gif; image/jpeg jpeg jpg; application/x-javascript js; application/atom+xml atom; text/mathml mml; text/plain txt; text/vnd.sun.j2me.app-descriptor jad; text/vnd.wap.wml wml; text/x-component htc; image/png png; image/tiff tif tiff; image/vnd.wap.wbmp wbmp; image/x-icon ico; image/x-jng jng; image/x-ms-bmp bmp; image/svg+xml svg; application/java-archive jar war ear; application/mac-binhex40 hqx; application/msword doc; application/pdf pdf; application/postscript ps eps ai; application/rtf rtf; application/vnd.ms-excel xls; application/vnd.ms-powerpoint ppt; application/vnd.wap.wmlc wmlc; application/vnd.wap.xhtml+xml xhtml; application/x-cocoa cco; application/x-java-archive-diff jardiff; application/x-java-jnlp-file jnlp; application/x-makeself run; application/x-perl pl pm; application/x-pilot prc pdb; application/x-rar-compressed rar; application/x-redhat-package-manager rpm; application/x-sea sea; application/x-shockwave-flash swf; application/x-stuffit sit; application/x-tcl tcl tk; application/x-x509-ca-cert der pem crt; application/x-xpinstall xpi; application/zip zip; application/octet-stream bin exe dll; application/octet-stream deb; application/octet-stream dmg; application/octet-stream eot; application/octet-stream iso img; application/octet-stream msi msp msm; audio/midi mid midi kar; audio/mpeg mp3; audio/x-realaudio ra; video/3gpp 3gpp 3gp; video/mpeg mpeg mpg; video/quicktime mov; video/x-flv flv; video/x-mng mng; video/x-ms-asf asx asf; video/x-ms-wmv wmv; video/x-msvideo avi; application/x-nokia-widget wgz; text/cache-manifest mf manifest
(2)location段配置
Location主要做定位功能,根据uri来进行不同的定位。 语法:location [=|~|~*|^~] /uri/ { …} = #普通字符精确匹配。也就是完全匹配 ^~ #表示uri以某个常规字符串开头,相当于匹配uri路径 ~ #区分大小写的正则匹配 !~ #区分大小写不匹配 !~* #不区分大小不匹配 ~* #不区分大小写的正则匹配 / #通用匹配 匹配优先级: 1. 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。 2. ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。 2. 正则表达式类型(~ ~*)的优先级次之。如果两个location都是一般匹配规则,那么会按照最长路径匹配 3. 一般匹配和正则匹配的过程是:首先会选择一般匹配过程中的大前缀匹配,但是匹配过程不会停止,最大前缀匹配只是一个临时结果,nginx还会继续检查正则location。 按照正则location在配置文件的物理顺序做匹配,如果匹配到一条正则location,就不会考虑后面的规则
location = / { # 仅仅匹配请求 / …… } location / { # 匹配所有以 / 开头的请求 # 但是如果有更长的同类型的表达式,则选择更长的表达式 # 如果有正则表达式可以匹配,则优先匹配正则表达式 …… } location /documents/ { # 匹配所有以 /documents/ 开头的请求。 # 但是如果有更长的同类型的表达式,则选择更长的表达式。 # 如果有正则表达式可以匹配,则优先匹配正则表达式。 …… } location ^~ /images/ { # 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找。 # 所以,即便有符合的正则表达式location,也不会被使用 …… } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif jpg jpeg结尾的请求。 # 但是 以 /images/开头的请求,将使用 Configuration D …… }
场景一:通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { root /web/wwwroot/www.starcto.com; expires 30d; }
场景二:将upload和html下的所有文件都交给nginx来处理,当然,upload和html目录包含在/web/wwwroot/www.starcto.com目录中。
location ~ ^/(upload|html)/ { root /web/wwwroot/www.starcto.com; expires 30d; }
场景三:location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。
location ~ .*.jsp$ { index index.jsp; proxy_pass http://localhost:8080; }
(3)StubStatus模块配置
location /nginxstatus { stub_status on; access_log logs/NginxStatus.log; auth_basic "NginxStatus"; auth_basic_user_file ../htpasswd; } # stub_status设置为"on"表示启用StubStatus的工作状态统计功能。 # access_log 用来指定StubStatus模块的访问日志文件。 # auth_basic是Nginx的一种认证机制。 # auth_basic_user_file用来指定认证的密码文件,由于Nginx的auth_basic认证采用的是与Apache兼容的密码文件,因此需要用Apache的htpasswd命令来生成密码文件。
# 添加一个webadmin用户,可以使用下面方式生成密码文件: /usr/local/apache/bin/htpasswd -c /opt/nginx/conf/htpasswd webadmin # 要查看Nginx的运行状态,可以输入http://ip/ NginxStatus,然后输入刚刚创建的用户名和密码就可以看到如下信息: Active connections: 1 server accepts handled requests 393411 393411 393799 Reading: 0 Writing: 1 Waiting: 0 # 信息输出解读: (1)"Active connections"表示当前活跃的连接数。 (2)第三行的三个数字表示 Nginx当前总共处理了393411个连接, 成功创建393411次握手, 总共处理了393799个请求。 (3)最后一行的"Reading"表示Nginx读取到客户端Header信息数, "Writing"表示Nginx返回给客户端的Header信息数,"Waiting"表示Nginx已经处理完,正在等候下一次请求指令时的驻留连接数。
三、其它参数解读
3.1 nginx负载调度状态
轮询(默认)# 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。 Weight # 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。 ip_hash # 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。 fair # 比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。 url_hash # 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。 down # 表示当前server 暂时不参与负载均衡 backup # 表示预留备份机器。当所有非backup机器全部故障异常,才会请求backup该机器 max_fails # 允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。 fail_timeout # 请求失败超时时间,在经历了max_fails次失败后,暂停服务的时间。max_fails和fail_timeout可以一起使用。 【注意】当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
3.2 upstream http简单形态
(1)upstream里包含负载均衡算法,后端服务器及相关其他配置。
(2)server里包含端口号,以及访问站点采用upstream哪个转发规则。
upstream a { ip_hash; # 负载均衡算法 server 10.27.0.224:80; server 10.27.0.225:80 down; server 10.27.0.226:8009 max_fails=3 fail_timeout=20s; server 10.27.0.227:8080; } upstream b { #若空白则为轮询算法 server 10.27.0.224:80 weight=1; #后端服务器 server 10.27.0.225:80 weight=1; } server { listen 8080; #ipv4端口号 listen [::]:8080; #ipv6端口号 server_name _; location / { proxy_pass http://a; #采用a 转发规则 } location /w { proxy_pass http://b/w; #采用b转发规则 } }
3.3 upstream tcp4层简单形态
(1)Nginx 1.9.0版本后支持四层负载均衡,一般不启用nginx_stream_core_module模块。操作时需进行验证,若成功,则nginx -V中必须包含 with-stream字眼。
(2)stream级别和http模块为同一级别,内含upstream和server模块
stream { upstream tcp4 { server 10.27.0.224:80 max_fails=2 fail_timeout=10s weight=1; server 10.27.0.225:80 max_fails=2 fail_timeout=10s weight=1; least_conn; } #负载均衡规则 server { listen 8081; listen [::]:8081; proxy_pass tcp4; #注意无http字眼 } }
3.4 upstream失败重试形态
(1)里添加超时时间和失败次数。 (2)里设置与后端超时时间机制、失败重试机制。
upstream failrepeat { server 10.9.163.205:80 max_fails=2 fail_timeout=10s weight=1; server 10.9.21.111:80 max_fails=2 fail_timeout=10s weight=1; #在10s内失败两次,后端节点则为不可用 } server { listen 8080; #ipv4端口号 listen [::]:8080; #ipv6端口号 server_name _; location /test { ##网络连接/读/写超时设置(超时) proxy_connect_timeout 5s; #与后端服务器建立连接超时的时间,默认60s,最高75s。 proxy_read_timeout 5s; #从后端服务器连续两次读操作的间隔时间,默认60s。该两次接超时无响应,则关闭连接。 proxy_send_timeout 5s; #从后端服务器连续两次写操作的间隔时间,默认60s。该两次接超时无响应,则关闭连接。 #失败重试机制设置(重试) proxy_next_upstream error timeout; #表明在请求响应头出错 或者 响应超时的情况下进行重试 proxy_next_upstream_timeout 10s; #重试最大超时时间,默认0 为不限制 proxy_next_upstream_tries 2; #重试次数,默认0 为不限制。该次数包含第一次请求。 #在重试最大超时10s里允许重试2次,超过两个中任何一个指标,则会结束重试,同步客户端 proxy_pass http://failrepeat/ad; add_header upstream_addr $upstream_addr; #服务器响应头会显示分配处理该服务的后端节点情况 } }
四、Nginx网络层面限制
4.1 Nginx网络连接数限流—limit_conn
(1)按IP地址限流
http{ ##限流规则1## limit_conn_zone $binary_remote_addr zone=abc:10m; #该规则名称为abc,用于限制ip访问,且只有10M共享内存放置链接 limit_conn_log_level error;#被限流后的日志级别为error,默认为error limit_conn_status 503;#被限流后,默认状态码为503 location /lim { alias /data/; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_conn abc 5; ##采用abc规则,只允许每个IP最大同时访问五次 } }
#超时验证: A、查看错误日志 cat /var/log/nginx/error.log B、查看接入日志: cat /var/log/nginx/access.log
(2)按域名地址限流
http{ ##限流规则2## limit_conn_zone $server_name zone=bcd:10m; #该规则名称为bcd,用于限制ip访问,且只有10M共享内存放置链接 limit_conn_log_level error; #被限流后的日志级别为error,默认为error limit_conn_status 503; #被限流后,默认状态码为503 location /lim { alias /data/; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_conn bcd 5; #采用bcd规则,只允许每个IP最大同时访问五次 } }
4.2 Nginx网络请求速率限流—limit_req
(1)按IP地址限制速率
http{ #限流规则3 limit_req_zone $binary_remote_addr zone=cde:10m rate=1r/s; #该规则名称为cde,用于限制ip访问,且只有10M共享内存放置链接,固定速率1次/每秒 limit_req_log_level error; #被限流后的日志级别为error,默认为error limit_req_status 503; #被限流后,默认状态码为503 #简单形式 location /lim { alias /data/; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_req cde ; ##采用cde规则 } #复杂形式01 location /lim02 { alias /data/; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_req cde burst 4; ##采用cde规则,最多同时接收到4个请求,若未满brust数值,则按固定速率1次/每秒处理 } #复杂形式02 location /lim03 { alias /data/; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_req cde burst 4 nodelay; ##采用cde规则,最多同时接收到4个请求,若未满brust数值,则可以不按规定速率处理。 } }
(2)按域名地址限制速率
http{ ##限流规则3## limit_req_zone $server_name zone=cde:10m rate=1r/s; #该规则名称为cde,用于限制ip访问,且只有10M共享内存放置链接,固定速率1次/每秒 limit_req_log_level error; #被限流后的日志级别为error,默认为error limit_req_status 503; #被限流后,默认状态码为503 #简单形式 location /lim { alias /data/; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_req cde ; ##采用cde规则 } #复杂形式01 location /lim02 { alias /data/; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_req cde burst 4; #采用cde规则,最多同时接收到4个请求,若未满brust数值,则按固定速率1次/每秒处理 } #复杂形式02 location /lim03 { alias /data/; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_req cde burst 4 nodelay; #采用cde规则,最多同时接收到4个请求,若未满brust数值,则可以不按规定速率处理。 } }
4.3 Nginx网络带宽限流—limit_rate(针对单个链接)
location /ad { alias /data/; index index.html; autoindex on; autoindex_exact_size on; autoindex_localtime on; limit_rate_after 10k; #当下载的文件(如:20M),已经下载超过10k,开始限速 limit_rate 1k; #最高下载速度为1k }
作者:UStarGao
链接:https://www.starcto.com/service_operations/170.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
UCloud云平台推荐
随便看看
- 2021-11-03Redis持久化解决方案实操
- 2021-01-29MySQL多线程复制配置
- 2021-08-01MySQL主从同步之半同步复制
- 2022-04-02Docker可视化管理工具-Portainer
- 2021-09-07Linux远程拷贝数据-限速和断点续传