Nginx-总结列表

Nginx配置详解

Nginx实现前后端分离,反向代理、负载均衡

Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内核 Poll 模型,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

Nginx 做为 HTTP 服务器,有以下几项基本特性:

  • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.

  • 无缓存的反向代理加速,简单的负载均衡和容错.

  • FastCGI,简单的负载均衡和容错.

  • 模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCGI 或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。

  • 支持 SSL 和 TLSSNI.

Nginx Plus 还提供了以下几个功能。

① 负载均衡

  • 基于 cookies 的会话保持功能。
  • 基于响应状态码和响应体的主动健康监测。
  • 支持 DNS 动态更新。

② 动态管理

  • 支持通过 API 清除内容缓存。
  • 可通过 API 动态管理上游的后端服务器列表。

③ 安全控制

  • 基于 API 和 OpenID 连接协议单点登录(SSO)的 JWT(JSON Web Token)认证支持。
  • Nginx WAF 动态模块。

④ 状态监控

  • 超过 90 个状态指标的扩展状态监控。
  • 内置实时图形监控面板。
  • 集成可用于自定义监控工具的 JSON 和 HTML 输出功能支持。

⑤ Kubernetes Ingress Controller

  • 支持 Kubernetes 集群 Pod 的会话保持和主动健康监测。
  • 支持 JWT 身份认证。

⑥ 流媒体

    • 支持自适性串流(Adaptive Bitrate Streaming,ABS)媒体技术 HLS(Apple HTTP Live Streaming)和 HDS(Adobe HTTP Dynamic Streaming)。
    • 支持对 MP4 媒体流进行带宽控制。

目录下的主要文件夹进行介绍:

  1、conf 目录:存放 Nginx 的主要配置文件,很多功能实现都是通过配置该目录下的 nginx.conf 文件,后面我们会详细介绍。

  2、docs 目录:存放 Nginx 服务器的主要文档资料,包括 Nginx 服务器的 LICENSE、OpenSSL 的 LICENSE 、PCRE 的 LICENSE 以及 zlib 的 LICENSE ,还包括本版本的 Nginx服务器升级的版本变更说明,以及 README 文档。

  3、html 目录:存放了两个后缀名为 .html 的静态网页文件,这两个文件与 Nginx 服务器的运行相关。

  4、logs 目录:存放 Nginx 服务器运行的日志文件。

  5、nginx.exe:启动 Nginx 服务器的exe文件,如果 conf 目录下的 nginx.conf 文件配置正确的话,通过该文件即可启动 Nginx 服务器。

Nginx 在启动后,会有一个 master 进程和多个 worker 进程。

master 进程主要用来管理 worker 进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动重新启动新的 worker 进程。而基本的网络事件,则是放在 worker 进程中来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。

Nginx 的模块根据其功能基本上可以分为以下几种类型:

  • event module: 搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括 ngx_events_module, ngx_event_core_module和ngx_epoll_module 等。Nginx 具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。

  • phase handler: 此类型的模块也被直接称为 handler 模块。主要负责处理客户端请求并产生待响应内容,比如 ngx_http_static_module 模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。

  • output filter: 也称为 filter 模块,主要是负责对输出的内容进行处理,可以对输出进行修改。例如,可以实现对输出的所有 html 页面增加预定义的 footbar 一类的工作,或者对输出的图片的 URL 进行替换之类的工作。

  • upstream: upstream 模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。upstream 模块是一种特殊的 handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。

  • load-balancer: 负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。

1.nginx重启关闭命令

ps -ef | grep nginx

接着我们进入到 sbin 目录,通过如下命令启动 nginx:

./nginx

方式1:快速停止

1 cd /usr/local/nginx/sbin
2 ./nginx -s stop

  此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。不太友好。

  方式2:平缓停止

1 cd /usr/local/nginx/sbin
2 ./nginx -s quit

方式1:先停止再启动

1 ./nginx -s quit
2 ./nginx

  相当于先执行停止命令再执行启动命令。

  方式2:重新加载配置文件

1 ./nginx -s reload

  通常我们使用nginx修改最多的便是其配置文件 nginx.conf。修改之后想要让配置文件生效而不用重启 nginx,便可以使用此命令。

  六、检测配置文件语法是否正确

  方式1:通过如下命令,指定需要检查的配置文件

nginx -t -c  /usr/local/nginx/conf/nginx.conf

优化 Nginx

hash表

Ngnix使用hash表来协助完成请求的快速处理。

考虑到保存键及其值的hash表存储单元的大小不至于超出设定参数(hash bucket size), 在启动和每次重新配置时,Nginx为hash表选择尽可能小的尺寸。

直到hash表超过参数(hash max size)的大小才重新进行选择. 对于大多数hash表都有指令来修改这些参数。例如,保存服务器名字的hash表是由指令server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。

事件模型

Nginx支持如下处理连接的方法(I/O复用方法),这些方法可以通过use指令指定。

  • 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 X. 使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。

  • epoll - 高效的方法,使用于Linux内核2.6版本及以后的系统。在某些发行版本中,如SuSE 8.2, 有让2.4版本的内核支持epoll的补丁。

  • rtsig - 可执行的实时信号,使用于Linux内核版本2.2.19以后的系统。默认情况下整个系统中不能出现大于1024个POSIX实时(排队)信号。这种情况对于高负载的服务器来说是低效的;所以有必要通过调节内核参数 /proc/sys/kernel/rtsig-max 来增加队列的大小。可是从Linux内核版本2.6.6-mm2开始, 这个参数就不再使用了,并且对于每个进程有一个独立的信号队列,这个队列的大小可以用 RLIMIT_SIGPENDING 参数调节。当这个队列过于拥塞,nginx就放弃它并且开始使用 poll 方法来处理连接直到恢复正常。

  • /dev/poll - 高效的方法,使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+.

  • eventport - 高效的方法,使用于 Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装 这个 安全补丁。

Nginx正则匹配符说明

1、正则表达式匹配,其中:

* ~  为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

2、文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行

如:

if (!-f $request_filename) {
proxy_pass  http://127.0.0.1;
}

Nginx 限制并发

nginx限制ip并发数,也是说限制同一个ip同时连接服务器的数量

1,添加limit_conn_zone

这个变量只能在http使用

http{
  ...
  #定义一个名为one的limit_zone,大小10M内存来存储session,
  #以$binary_remote_addr 为key
  #nginx 1.18以后用limit_conn_zone替换了limit_conn
  #且只能放在http作用域
  limit_conn_zone $binary_remote_addr zone=one:10m; 

2,添加limit_conn

这个变量可以在http, server, location使用
只限制一个站点,所以添加到server里面

server{
    ...
    location {
      ...
       limit_conn one 20;		  #连接数限制
       #带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
       limit_rate 500k;		 
      ...
    }
    ...
  }

1,添加limit_req_zone

这个变量只能在http使用

http{
  ...
  #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
  #以$binary_remote_addr 为key,限制平均每秒的请求为5个,
  #1M能存储16000个状态,rete的值必须为整数,
  #如果限制两秒钟一个请求,可以设置成30r/m
  limit_req_zone $binary_remote_addr zone=allips:10m rate=5r/s;

2,添加limit_req

这个变量可以在http, server, location使用
只限制一个站点,所以添加到server里面

  server{
    ...
    location {
      ...
      #限制每ip每秒不超过20个请求,漏桶数burst为5
      #brust的意思就是,如果第1秒、2,3,4秒请求为19个,
      #第5秒的请求为25个是被允许的。
      #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
      #nodelay,如果不设置该选项,严格使用平均速率限制请求数,
      #第1秒25个请求时,5个请求放到第2秒执行,
      #设置nodelay,25个请求将在第1秒执行。
      limit_req zone=allips burst=5 nodelay;
      ...
    }
    ...
  }

Nginx 限制IP带宽占用

1,添加limit_conn_zone

这个变量只能在http使用

http{
  ...
  #定义一个名为one的limit_zone,大小10M内存来存储session,
  #以$binary_remote_addr 为key
  #nginx 1.18以后用limit_conn_zone替换了limit_conn
  #且只能放在http作用域
  limit_conn_zone $binary_remote_addr zone=one:10m;

2,添加limit_conn,limit_rate

这两个变量可以在http, server, location使用
只限制一个站点,所以添加到server里面

limit_conn one 2; #限制每个IP只能发起两个并发连接。

limit_rate 300k; #对每个连接限速300k。

注意,这里是对连接限速,而不是对IP限速。
如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×limit_conn。比如 300k × 2 就是对ip的流量带宽控制

示例:

server{
    ...
    location {
      ...
       limit_conn one 2;		  #连接数限制
       #带宽限制,对单个连接限数,如果一个ip两个连接,就是300x2 k
       limit_rate 300k;		 
      ...
    }
    ...
  }

配置详解:

#定义Nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

 
#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
upstream blog.ha97.com { #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 server 192.168.80.121:80 weight=3; server 192.168.80.122:80 weight=2; server 192.168.80.123:80 weight=3; } #虚拟主机的配置 server { #监听端口 listen 80; #域名可以有多个,用空格隔开 server_name www.ha97.com ha97.com; index index.html index.htm index.php; root /data/www/ha97; location ~ .*\.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } #图片缓存时间设置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } #JS和CSS缓存时间设置 location ~ .*\.(js|css)?$ { expires 1h; } #日志格式设定 log_format access '$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/ha97access.log access; #对 "/" 启用反向代理 location / { proxy_pass http://127.0.0.1:88; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可选。 proxy_set_header Host $host; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 } #本地动静分离反向代理配置 #所有jsp的页面均交由tomcat或resin处理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } #所有静态文件由nginx直接读取不经过tomcat或resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; } } }

2、全局块

  从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

3、events 块

  比如上面的配置:

events {
    worker_connections  1024;
}

  events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

4、http 块

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

  需要注意的是:http 块也可以包括 http全局块server 块

①、http 全局块

  http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

②、server 块

  这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。后面会详细介绍虚拟主机的概念。

  每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

  而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

  1、全局 server 块

  最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。

  2、location 块

  一个 server 块可以配置多个 location 块。

nginx高性能配置详解

nginx配置详解
 
#全局配置
 
#高层配置
 
user www-data #运行用户 默认配置
 
pid /var/run/nginx.pid;#端口号默认配置
 
worker_processes 8;#定义了nginx对外提供web服务时的worker进程数
 
#最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式
 
#通常设置成和cpu的数量相等(设置为"auto"将尝试自动检测它)
 
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;#将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu
 
worker_rlimit_nofile 200000;#更改worker进程的最大打开文件数限制
 
#如果没设置的话,这个值为操作系统的限制
 
#设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有"too many open files"问题了
 
#假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误
 
#这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致
 
events {
 
worker_connections 102400; #设置可由一个worker进程同时打开的最大连接数
 
#如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。
 
#重点:最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处
 
#理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
 
multi_accept on; #告诉nginx收到一个新连接通知后接受尽可能多的连接
 
use epoll; #设置用于复用客户端线程的轮询方法
 
}
 
http {
 
server_tokens off; #并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的
 
sendfile on; #可以让sendfile()发挥作用
 
tcp_nopush on; #告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送
 
tcp_nodelay on; #告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值
 
access_log off; #设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快(aka,YOLO)
 
error_log /var/log/nginx/error.log crit;#告诉nginx只能记录严重的错误
 
keepalive_timeout 10; #给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作的时间更长
 
client_header_timeout 10; #设置请求头的超时时间。我们也可以把这个设置低些。
 
client_body_timeout 10; #设置请求体的超时时间。我们也可以把这个设置低些。
 
reset_timedout_connection on; #告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
 
send_timeout 10;#指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接
 
limit_conn_zone $binary_remote_addr zone=addr:5m;#设置用于保存各种key(比如当前连接数)的共享内存的参数。
 
#5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。
 
limit_conn #为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接
 
include /etc/nginx/mime.types; #只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型
 
default_type text/html;#设置文件使用的默认的MIME-type
 
charset UTF-8; #设置头文件中的默认的字符集
 
gzip on; #是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量
 
gzip_disable "msie6"; # 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容
 
# gzip_static on; #告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源
 
#这要求你预先压缩你的文件,从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了
 
gzip_proxied any; #允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
 
gzip_min_length 1000; #设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,
 
#我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度
 
gzip_comp_level 4; #设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。
 
#我们设置为4,这是一个比较折中的设置
 
gzip_buffers 16 8k;
 
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;#设置需要压缩的数据格式
 
open_file_cache max=100000 inactive=20s; #打开缓存的同时也指定了缓存最大数目,以及缓存的时间。
 
#我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉
 
open_file_cache_valid 30s; #在open_file_cache中指定检测正确信息的间隔时间
 
open_file_cache_min_uses 2; #定义了open_file_cache中指令参数不活动时间期间里最小的文件数
 
open_file_cache_errors on;
 
include /etc/nginx/conf.d/*.conf;
 

2.通过nginx部署前端代码实现前后端分离 

server {
    listen       7777;
    #静态文件,nginx自己处理
    location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$  

              {
                     root html;
                     expires 30d; #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
              }
         location /{
            root   /Users/xiaoyun/git/someproject/dist;
        }

        location /api/v1{
               proxy_set_header Host api.yourhost.com;
               proxy_pass http://api.yourhost.com/api/v1/;
        }
        location /api/v2{
                proxy_pass  http://api.yourhost.com/new;
        }
    }

以上是一段nginx配置参考:

listen    nginx服务端口号

location  /    设置默认根目录所访问的本地代码路径,这里还可以设置默认主页index

proxy_pass   请求转发,可以配置多个,从上至下进行匹配

以第一个配置为例,即所有本地以/api/v1开头的请求都会转发至对应线上服务器,

例如  http://localhost:7777/api/v1/getConfig 则会自动转发自 http://api.yourhost.com/api/v1/getConfig

另外,还需要注意的是,proxy_pass配置的路径如果是以/结尾,如上面的配置v1,那么此时路径为相对路径,否则为绝对路径

例如 v2的转发配置:

如果请求 http://localhost:7777/api/v2/user/list   则会转发自 http://api.yourhost.com/new/user/list ,不会带有原路径的 /api/v2

3.负载均衡

①、普通轮询算法

②、基于比例加权轮询

③、基于IP路由负载

④、基于服务器响应时间负载分配

⑤、对不同域名实现负载均衡

#一个简单的负载均衡的示例,把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。

http {
upstream backend { server 127.0.0.1:8000 weight=3; server 127.0.0.1:8001; server 127.0.0.1:8002; server 127.0.0.1:8003; } server { listen 80; server_name localhost; location / { proxy_pass http://backend; } } }

4.nginx.conf配置文件详解

Nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)和 location(URL匹配特定位置后的设置),每部分包含若干个指令。main部分设置的指令将影响其它所有部分的设置;server部分的指令主要用于指定虚拟主机域名、IP和端口;upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。

4.1 通用

下面的nginx.conf简单的实现nginx在前端做反向代理服务器的例子,处理js、png等静态文件,jsp等动态请求转发到其它服务器tomcat:

user  www www;
worker_processes  2;

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    use epoll;
    worker_connections  2048;
}


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        on;
    # tcp_nopush     on;

    keepalive_timeout  65;

  # gzip压缩功能设置
    gzip on;
    gzip_min_length 1k;
    gzip_buffers    4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;

  # http_proxy 设置
    client_max_body_size   10m;
    client_body_buffer_size   128k;
    proxy_connect_timeout   75;
    proxy_send_timeout   75;
    proxy_read_timeout   75;
    proxy_buffer_size   4k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size   64k;
    proxy_temp_file_write_size  64k;
    proxy_temp_path   /usr/local/nginx/proxy_temp 1 2;

  # 设定负载均衡后台服务器列表 
    upstream  backend  { 
              #ip_hash; 
              server   192.168.10.100:8080 max_fails=2 fail_timeout=30s ;  
              server   192.168.10.101:8080 max_fails=2 fail_timeout=30s ;  
    }

  # 很重要的虚拟主机配置
    server {
        listen       80;
        server_name  itoatest.example.com;
        root   /apps/oaapp;

        charset utf-8;
        access_log  logs/host.access.log  main;

        #对 / 所有做负载均衡+反向代理
        location / {
            root   /apps/oaapp;
            index  index.jsp index.html index.htm;

            proxy_pass        http://backend;  
            proxy_redirect off;
            # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;  
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        }

        #静态文件,nginx自己处理,不去backend请求tomcat
        location  ~* /download/ {  
            root /apps/oa/fs;  

        }
        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$   
        {   
            root /apps/oaapp;   
            expires      7d; 
        }
        location /nginx_status {
            stub_status on;
            access_log off;
            allow 192.168.10.0/24;
            deny all;
        }

        location ~ ^/(WEB-INF)/ {   
            deny all;   
        }
        #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   html;
        }
    }

  ## 其它虚拟主机,server 指令开始
}

4.2 常用指令说明

4.2.1 main全局配置

nginx在运行时与具体业务功能(比如http服务或者email服务代理)无关的一些参数,比如工作进程数,运行的身份等。

  • woker_processes 2
    在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数grep ^processor /proc/cpuinfo | wc -l,也是 auto 值,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。
  • worker_cpu_affinity
    也是写在main部分。在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。
  • worker_connections 2048
    写在events部分。每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。nginx作为反向代理服务器,计算公式 最大连接数 = worker_processes * worker_connections/4,所以这里客户端最大连接数是1024,这个可以增到到8192都没关系,看情况而定,但不能超过后面的worker_rlimit_nofile。当nginx作为http服务器时,计算公式里面是除以2。
  • worker_rlimit_nofile 10240
    写在main部分。默认是没有设置,可以限制为操作系统最大的限制65535。
  • use epoll
    写在events部分。在Linux操作系统下,nginx默认使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。在操作系统不支持这些高效模型时才使用select。

4.2.2 http服务器

与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。

  • sendfile on
    开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
  • keepalive_timeout 65 : 长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
  • send_timeout : 用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
  • client_max_body_size 10m
    允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
  • client_body_buffer_size 128k
    缓冲区代理缓冲用户端请求的最大字节数

模块http_proxy
这个模块实现的是nginx作为反向代理服务器的功能,包括缓存功能(另见文章

  • proxy_connect_timeout 60
    nginx跟后端服务器连接超时时间(代理连接超时)
  • proxy_read_timeout 60
    连接成功后,与后端服务器两个成功的响应操作之间超时时间(代理接收超时)
  • proxy_buffer_size 4k
    设置代理服务器(nginx)从后端realserver读取并保存用户信息的缓冲区大小,默认与proxy_buffers大小相同,其实可以将这个指令值设的小一点
  • proxy_buffers 4 32k
    proxy_buffers缓冲区,nginx针对单个连接缓存来自后端realserver的响应,网页平均在32k以下的话,这样设置
  • proxy_busy_buffers_size 64k
    高负荷下缓冲大小(proxy_buffers*2)
  • proxy_max_temp_file_size
    当proxy_buffers放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M,它与proxy_cache没有关系。大于这个值,将从upstream服务器传回。设置为0禁用。
  • proxy_temp_file_write_size 64k
    当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小。proxy_temp_path(可以在编译的时候)指定写到哪那个目录。

proxy_pass,proxy_redirect见 location 部分。

模块http_gzip

  • gzip on : 开启gzip压缩输出,减少网络传输。

    • gzip_min_length 1k : 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数,小于1k可能会越压越大。
    • gzip_buffers 4 16k : 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
    • gzip_http_version 1.0 : 用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项,如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话,由于末端通信是 http/1.0,故请设置为 1.0。
    • gzip_comp_level 6 : gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
    • gzip_types :匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
    • gzip_proxied any : Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头。
    • gzip_vary on : 和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。。

4.2.3 server虚拟主机

http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。

  • listen
    监听端口,默认80,小于1024的要以root启动。可以为listen *:80、listen 127.0.0.1:80等形式。
  • server_name
    服务器名,如localhost、www.example.com,可以通过正则匹配。

模块http_stream
这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡,upstream后接负载均衡器的名字,后端realserver以host:port options; 方式组织在 {} 中。如果后端被代理的只有一台,也可以直接写在 proxy_pass 。

4.2.4 location

http服务中,某些特定的URL对应的一系列配置项。

    • root /var/www/html
      定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件,root没什么作用,一般放在server指令里面或/下。
    • index index.jsp index.html index.htm
      定义路径下默认访问的文件名,一般跟着root放
    • proxy_pass http:/backend
      请求转向backend定义的服务器列表,即反向代理,对应upstream负载均衡器。也可以proxy_pass http://ip:port。
    • proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

nginx动静分离

1. 场景描述

今天做nginx的动静分离,稍微走了点弯路,其实也谈不上,记录下吧,希望可以帮到有需要的朋友。

2. 解决方案

先说下我们的需求,使用域名(www.ruanjianlaowang.com)到服务器,服务器使用openresty部署的nginx,然后nginx做动静分离,静态文件按照模块分区;动态文件走负载均衡(走到springcloud gateway做用户统一认证后,再路由到对应系统),域名默认路由到首页。

2.1 整体思路

(1)首先是静态文件,在nginx的html文件中新建static文件夹,各个模块在static下面新建自己的文件夹;

(2)除了静态文件,其余的都走动态代理,首先判断下是不是域名不带任何后缀,是的话,直接跳转到index.html;

(3)动态请求跳转,负载均衡,跳转到网关进行校验。

2.2 配置说明

整体配置如下:

#软件老王
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
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        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
     upstream ruanjianlaowang{
       server 10.192.168.111:8002; 
       server 10.192.168.222:8002;
       server 10.192.168.333:8002;
     } 
    server {
        listen       80;
        server_name  ruanjianlaowang.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #1 静态
        location /static {
             root   /opt/openresty/nginx/html;
             #index index.html;
        }     
        #2 动态
         location / {
          #3 首页
              if ( $request_uri = "/" ) {
              rewrite "/" http://ruanjianlaowang.com/static/index.html break;
              }
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto $scheme;
             proxy_set_header Host $host:80;
             proxy_set_header X-NginX-Proxy true;
             proxy_set_header Connection "";
             proxy_http_version 1.1;
             #4负载均衡
             proxy_pass http://ruanjianlaowang;
        } 
       underscores_in_headers on;
    }
}
#软件老王

详细说明:

(1) 静态请求

当使用www.ruanjianlaowang.com/static进行请求的时候,首先精确匹配到/opt/openresty/nginx/html/static下面找对应的静态资源返回。

        #1 静态
        location /static {
             root   /opt/openresty/nginx/html;
             #index index.html;
        } 

(2)动态请求

除去静态资源的精确匹配(/static),其他走动态资源请求。

  #2 动态
         location / {
         }

(3)首页跳转

当请求中uri中只有域名的时候,转到index.html首页。

#2 动态
         location / {
          #3 首页
              if ( $request_uri = "/" ) {
              rewrite "/" http://ruanjianlaowang.com/static/index.html break;
              }
        } 

(4)负载均衡,转网关

        #2 动态
         location / {
          #3 首页
              if ( $request_uri = "/" ) {
              rewrite "/" http://ruanjianlaowang.com/static/index.html break;
              }
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto $scheme;
             proxy_set_header Host $host:80;
             proxy_set_header X-NginX-Proxy true;
             proxy_set_header Connection "";
             proxy_http_version 1.1;
             #4负载均衡,软件老王
             proxy_pass http://ruanjianlaowang;
        }     
     upstream ruanjianlaowang{
       server 10.192.168.111:8002; 
       server 10.192.168.222:8002;
       server 10.192.168.333:8002;
     } 

 

posted @ 2021-02-27 21:19  hanease  阅读(356)  评论(0编辑  收藏  举报