前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx 摘录

nginx 摘录

作者头像
彭华盛
发布2020-03-06 10:39:19
4300
发布2020-03-06 10:39:19
举报
文章被收录于专栏:运维之路运维之路

前阵子因为工作上的变故,有一阵子没有写东西,接下来继续开始写东西,仍以运维为主,可能会把自己学习业务知识方面的一些有趣的心得也一并写写。

这两天搭建nginx,收集了一些资料,现对收集的资料做个整理:

一、概述

Nginx是一个高性能的HTTP,以及可以提供反向代理、负载均衡、WEB服务器等功能的软件,其特点是占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。

二、nginx几个作用

1.反向代理

反向代理是指以代理服务器来接受连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,或同一台服务器不同端口。

代码语言:javascript
复制
server {  
        listen      80;                                     
        server_name  localhost;                             
        client_max_body_size 1024M;
        location / {                           #匹配指向请求URL后的路径,可以多个
            proxy_pass http://localhost:8080;  #URL后缀不得以在端口后加个工程目录
            proxy_set_header Host $host:$server_port;
        }
    }

2.负载均衡

负载均衡也是Nginx常用的一个功能。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

1) RR(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

代码语言:javascript
复制
upstream test {
   server localhost:8080;
   server localhost:8081;
}
server {
    listen   81;                                            
    server_name  localhost;                                 
    client_max_body_size 1024M;
    location / {
      proxy_pass http://test;
      proxy_set_header Host $host:$server_port;
    }
}
upstream test {
  server localhost:8080;
  server localhost:8081;
}

2) 权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如

代码语言:javascript
复制
upstream test {
   server localhost:8080 weight=9;
   server localhost:8081 weight=1;
}

那么10次一般只会有1次会访问到8081,而有9次会访问到8080

3) ip_hash

上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream test {

ip_hash;

server localhost:8080;

server localhost:8081;

}

4) fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend {

fair;

server localhost:8080;

server localhost:8081;

}

5) url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

代码语言:javascript
复制
    upstream backend { 
        hash $request_uri; 
        hash_method crc32; 
        server localhost:8080;
        server localhost:8081;
    } 

以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用.

3.HTTP服务器

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器

代码语言:javascript
复制
    server {
        listen       80;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;
        location / {
               root   e:wwwroot;
               index  index.html;
           }
    }

这样如果访问http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

4.动静分离(web分离)

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

代码语言:javascript
复制
upstream test{  
       server localhost:8080;  
       server localhost:8081;  
    }   
    server {  
        listen       80;  
        server_name  localhost;  
        location / {  
            root   e:wwwroot;  
            index  index.html;  
        }  
        # 所有静态请求都由nginx处理,存放目录为html  
        location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {  
            root    e:wwwroot;  
        }  
        # 所有动态请求都转发给tomcat处理  
        location ~ .(jsp|do)$ {  
            proxy_pass  http://test;  
        }  
        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
            root   e:wwwroot;  
        }  
    }  

HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式

例:

语法规则: location [=|~|~*|^~] /uri/ { ... }

= 表示精确匹配,这个优先级也是最高的^~ 表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。nginx 不对 url 做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)。~ 表示区分大小写的正则匹配~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写) !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则/ 通用匹配,任何请求都会匹配到,默认匹配.

5.正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

代码语言:javascript
复制
resolver 114.114.114.114 8.8.8.8;
    server {
        resolver_timeout 5s;
        listen 81;
        access_log  e:wwwrootproxy.access.log;
        error_log   e:wwwrootproxy.error.log;
        location / {
            proxy_pass http://$host$request_uri;
        }
    }

注:负载均衡通常使用正向代理加upstream的方式

三、nginx主要配置说明

1、常用命令

nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。

nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。

nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载。

nginx -s reopen 重新打开日志文件。

nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。

nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

nginx -v 显示 nginx 的版本。

nginx -V 显示 nginx 的版本,编译器版本和配置参数。

四、nginx配置说明

1、server:虚拟主要,可以根据需要配置多个

代码语言:javascript
复制
# vim /usr/local/nginx-1.5.1/conf/nginx.conf 
  #配置虚拟主机
server{                                 
#虚拟主机的域名,可以写多个域名,类似于别名
   server_name a.ttlsa.com;  
   listen 80;
#站点根目录,你网站文件存放的地方。注:站点目录和域名尽量一样
    root /data/site/a.ttlsa.com;  
    access_log /data/logs/nginx/a.ttlsa.com-access.log main; 

    location /{
        ……
    } 
} 

2、location:

location / { echo "/"; }

访问 http://a.ttlsa.com/nginx,因为完全匹配了”=/nginx”

# curl http://a.ttlsa.com/nginx =/nginx 访问 http://a.ttlsa.com/nginx,从第一个开始尝试匹配,最后匹配到了~* \.png$ . # curl http://a.ttlsa.com/xxx/1111.PNG (注意,这是大写) all-png 访问 http://a.ttlsa.com/static/1111.png,虽然 static 放在最后面,但是因为有^的缘故,他是最匹配的.# curl http://a.ttlsa.com/static/1111.png Static

3、 upstream

代码语言:javascript
复制
upstream monitor_server {    server 192.168.0.131:80;    server 192.168.0.132:80;} server { listen 80; server_name nagios.xxx123.tk; location / {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; proxy_pass http://monitor_server;}} 

4、include

include /etc/nginx/conf.d/*.conf;

5、超时设置

roxy_connect_timeout 300s;

proxy_read_timeout 300s;

proxy_send_timeout 300s;

报错日志:

...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略)

五、性能调优

1、调优Linux 的配置

1)缓冲区队列

下面的设置与连接及其如何排队相关。如果传入连接速率很高,导致性能参次不齐(例如一些连接似乎停滞了),改变这些配置会有效。

  • net.core.somaxconn:排队等待连接的最大数目,由NGINX可接受的数目决定。默认值通常很低,但可以接受,因为NGINX 接收连接非常快,但如果网站流量大时,就应该增加这个值。内核日志中的错误消息会提醒这个值太小了,把值改大,直到错误提示消失。 注意: 如果设置这个值大于512,相应地也要改变NGINX listen指令的backlog参数。
  • net.core.netdev_max_backlog : 在提交到CPU前网卡中数据包缓冲的速率,高带宽下提高这个值可提高性能。检查内核日志文件中有关这个设置的错误,根据网卡文档中的建议修改这个值。
2)文件描述符

文件描述符是操作系统资源,用于表示连接、打开的文件,以及其他信息。NGINX 每个连接可以使用两个文件描述符。例如,如果NGINX充当代理时,通常一个文件描述符表示客户端连接,另一个连接到代理服务器,如果开启了HTTP 保持连接,这个比例会更低(译注:为什么更低呢)。对于有大量连接服务的系统,下面的设置可能需要调整一下:

  • sys.fs.file_max —— 文件描述符系统级别的限制
  • nofile —— 用户级别文件描述符限制,在 /etc/security/limits.conf 文件中修改。
3)临时端口

当NGINX充当代理时,每个到上游服务器的连接都使用一个短暂或临时端口。可能需要修改这些设置:

  • net.ipv4.ip_local_port_range —— 端口值的起止范围。如果你发现用尽端口号,可以增大端口范围。一般端口号设置是1024到65000。

2、调优NGINX配置

以下是一些可以影响性能的NGINX指令。如上所述,我们只讨论自己能调整的指令。我们建议你在没有NGINX团队指导下,不要调整别的指令。

1)工作进程

NGINX可以运行多个工作进程,每个都可处理大量并发连接。可以控制工作进程数,用下面的指令管理它们的连接:

  • worker_processes —— NGINX工作进程数(默认值是1)。在大多数情况下,一个CPU内核运行一个工作进程最好,建议将这个指令设置成自动就可以。有时可能想增大这个值,比如当工作进程需要做大量的磁盘I/O。
  • worker_connections —— 每个工作进程可以处理并发的最大连接数。默认值是512,但多数系统有充足的资源可以支撑更多的连接。合适的设置可以根据服务器的大小和流量的性质决定,可以通过测试修改。
2)长连接

长连接对性能有很大的影响,通过减少CPU和网络开销需要开启或关闭连接。NGINX终止所有客户端连接,创建到上游服务器独立的连接。NGINx支持客户端和上游服务器两种长连接。下面是和客户端的长连接相关的指令:

  • keepalive_requests-单个客户端长连接可以请求的数量,默认值是100,但是当使用压力测试工具从一个客户端发送多个请求测试时,这个值设更高些特别有用。
  • keepalive_timeout—空闲长连接保持打开状态的时间。

下面是和上游服务器长连接的相关指令:

  • keepalive –每个工作进程中空闲长连接到上游服务器保持开启的连接数量。没有默认值。

要使用连接到上游服务器的长连接,必须要配置文件中下面的指令。

proxy_http_version 1.1; proxy_set_header Connection "";

3)访问日志

记录每个请求会消耗CPU和I/O周期,一种降低这种影响的方式是缓冲访问日志。使用缓冲,而不是每条日志记录都单独执行写操作,NGINX会缓冲一连串的日志记录,使用单个操作把它们一起写到文件中。

要启用访问日志的缓存,就涉及到在access_log指令中buffer=size这个参数。当缓冲区达到size值时,NGINX会把缓冲区的内容写到日志中。让NGINX在指定的一段时间后写缓存,就包含flush=time参数。当两个参数都设置了,当下个日志条目超出缓冲区值或者缓冲区中日志条目存留时间超过设定的时间值,NGINX都会将条目写入日志文件。当工作进程重新打开它的日志文件或退出时,也会记录下来。要完全禁用访问日志记录的功能,将access_log 指令设置成off参数。

4)Sendfile

操作系统的sendfile()系统调用可以实现从一个文件描述符到另一个文件描述符的数据拷贝,通常实现零拷贝,这能加速TCP数据传输。要让NGINX使用它,在http或server或location环境中包含sendfile指令。NGINX可以不需要切换到用户态,就把缓存或磁盘上的内容写入套接字 ,而且写的速度非常快,消耗更少的CPU周期。注意,尽管使用sendfile()数据拷贝可以绕过用户态,这不适用于常规的NGINX处理改变内容的链和过滤器, 比如gzip。当配置环境下有sendfile指令和激活内容更改过滤器的指令时,NGINX会自动禁用sendfile。

5)限制

你可以设置多个限制,防止用户消耗太多的资源,避免影响系统性能和用户体验及安全。 以下是相关的指令:

  • limit_conn and limit_conn_zone—NGINX接受客户连接的数量限制,例如单个IP地址的连接。设置这些指令可以防止单个用户打开太多的连接,消耗超出自己的资源。
  • limit_rate–传输到客户端响应速度的限制(每个打开多个连接的客户消耗更多的带宽)。设置这个限制防止系统过载,确保所有客户端更均匀的服务质量。
  • limit_req and limit_req_zone– NGINX处理请求的速度限制,与limit_rate有相同的功能。可以提高安全性,尤其是对登录页面,通过对用户限制请求速率设置一个合理的值,避免太慢的程序覆盖你的应用请求(比如DDoS攻击)。
  • max_conns上游配置块中服务器指令参数。在上游服务器组中单个服务器可接受最大并发数量。使用这个限制防止上游服务器过载。设置值为0(默认值)表示没有限制。
  • queue (NGINX Plus) – 创建一个队列,用来存放在上游服务器中超出他们最大max_cons限制数量的请求。这个指令可以设置队列请求的最大值,还可以选择设置在错误返回之前最大等待时间(默认值是60秒)。如果忽略这个指令,请求不会放入队列。

3、缓存和压缩可以提高性能

NGINX的一些额外功能可用于提高Web应用的性能,调优的时候web应用不需要关掉,但值得一提,因为它们的影响可能很重要。 它们包括缓存和压缩。

1)缓存

一个启用NGINX缓存的情景,一组web或者应用服务器负载均衡,可以显著缩短对客户端的响应时间,同时大幅度降低后端服务器的负载。缓存本身就可以作个专题来讲,这里我们就不试图讲它了。参阅NGINX Plus管理手册的NGINX内容缓存。

2)压缩

所以使用更小的网络带宽。然而尽管压缩数据会消耗CPU资源,但当需要减少网络带宽使用时这样做非常有效。需要注意的是,不能对已压缩的文件再压缩例如JPEG 文件。有关更多的信息,请参阅“NGINX Plus管理指南”中的压缩和解压缩。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 五、性能调优
  • 1、调优Linux 的配置
    • 2)文件描述符
      • 3)临时端口
      • 2、调优NGINX配置
        • 1)工作进程
          • 2)长连接
            • 3)访问日志
              • 4)Sendfile
                • 5)限制
                • 3、缓存和压缩可以提高性能
                  • 1)缓存
                    • 2)压缩
                    相关产品与服务
                    负载均衡
                    负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档