大家好,我是民工哥。

无论是运维、开发、测试,Nginx技术栈的学习总是必不可少的,只是不同的岗位把握的深度与广度不同而已。所以,民工哥利用周末休息时间,将往期推送的Nginx文章给大家重新整理进去,整顿出成体系的Nginx常识体系,供大家学习与参考。

码字不易,如有帮忙,请点在看与转发朋友圈反对一波,感激!!!!

Nginx 简介

Nginx 是开源高性能高牢靠Web反向代理服务器,而且反对热部署,简直能够做到 7 * 24 小时不间断运行,即便运行几个月也不须要重新启动,还能在不间断服务的状况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能反对高达 5w 个并发连接数,最重要的是, Nginx 是收费的并能够商业化,配置应用也比较简单。

官方网站:http://www.nginx.org

Nginx 特点

Web服务器

高性能的WEB服务器软件,与Apache相比,它反对更多的并发连贯且占用服务器资源少,效率高

反向代理或负载平衡服务器

作为负载平衡服务器,它能够作为HTTP SERVER或DB等服务的代理服务器,相似Haproxy代理软件的性能,Nginx的代理性能绝对简略,效率也不迭Haproxy,同时它也是一个优良的邮件代理服务软件

缓存服务器

Nginx还能够作缓存服务器,相似于业余的缓存软件性能

Nginx 优缺点

Nginx 长处
  • 高并发:能反对1-2万甚至更多的并发连贯(动态小文件)
  • 内存耗费少
  • 能够做HTTP反向代理——负载平衡的性能
  • 内置对集群节点服务器的衰弱性查性能,不过性能绝对较弱
  • 通过cache插件能够实现缓存软件可能实现的性能
Nginx 的毛病

Nginx 仅能反对http、https和Email协定,这样就在适用范围下面小些,这个是它的毛病

对后端服务器的健康检查,只反对通过端口来检测,不反对通过 url来检测。不反对 Session 的间接放弃,但能通过 ip_hash 来解决

Nginx 利用场景

Nginx 的最重要的几个应用场景:

  • 动态资源服务,通过本地文件系统提供服务;
  • 反向代理服务,延长出包含缓存、负载平衡等;
  • API 服务, OpenResty ;

对于前端来说 Node.js 并不生疏, Nginx 和 Node.js 的很多理念相似, HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分性能应用 Node.js 也能够实现,但 Nginx 和 Node.js 并不抵触,都有本人善于的畛域。Nginx 擅长于底层服务器端资源的解决(动态资源解决转发、反向代理,负载平衡等), Node.js 更善于下层具体业务逻辑的解决,两者能够完满组合。

用一张图示意:

Nginx 到底能够做什么?看完这篇你就懂了!

更多对于Nginx罕用场景利用配置可参考:

  • 请务必珍藏!Nginx 五大常见利用场景
  • 彻底搞懂 Nginx 五大利用场景!进来吹牛逼再也不放心了

Apache VS Nginx

Apache和Nginx都属于Web服务器,两者都实现了HTTP 1.1协定。无论是抉择哪个,都是依据利用场景来决定的,所以些文件仅从利用场景登程,来比照两者之间的各自特点。要让正确的工具,做出正确的事。

性能比照

Nginx和Apache一样,都是HTTP服务器软件,在性能实现上都采纳模块化结构设计,都反对通用的语言接口,如PHP、Perl、Python等,同时还反对正向和反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输等。

  • 在性能实现上,Apache的所有模块都反对动、动态编译,而Nginx模块都是动态编译的,
  • 对FastCGI的反对,Apache对Fcgi的反对不好,而Nginx对Fcgi的反对十分好;
  • 在解决连贯形式上,Nginx反对epoll,而Apache却不反对;
  • 在空间应用上,Nginx安装包仅仅只有几百K,和Nginx比起来Apache相对是硕大无朋。
Nginx绝对apache的长处
  • 轻量级,同样起web 服务,比apache 占用更少的内存及资源
  • 动态解决,Nginx 动态解决性能比 Apache 高 3倍以上
  • 抗并发,nginx 解决申请是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能放弃低资源低消耗高性能。在- - Apache+PHP(prefork)模式下,如果PHP解决慢或者前端压力很大的状况下,很容易呈现Apache过程数飙升,从而拒绝服务的景象。
  • 高度模块化的设计,编写模块绝对简略
  • 社区沉闷,各种高性能模块出品迅速啊
apache绝对nginx的长处
  • rewrite,比nginx 的rewrite 弱小
  • 模块超多,根本想到的都能够找到
  • 少bug,nginx的bug绝对较多
  • 超稳定
  • Apache对PHP反对比较简单,Nginx须要配合其余后端用

更多更具体的比拟阐明请参考:Apache VS Nginx,你选对了吗?

Nginx 装置

本文以CentOS 7.x 零碎为例,应用 yum 装置 Nginx。

yum install nginx -y

装置实现后,通过 rpm -ql nginx 命令查看 Nginx 的装置信息。

# Nginx配置文件/etc/nginx/nginx.conf # nginx 主配置文件/etc/nginx/nginx.conf.default# 可执行程序文件/usr/bin/nginx-upgrade/usr/sbin/nginx# nginx库文件/usr/lib/systemd/system/nginx.service # 用于配置零碎守护过程/usr/lib64/nginx/modules # Nginx模块目录# 帮忙文档/usr/share/doc/nginx-1.16.1/usr/share/doc/nginx-1.16.1/CHANGES/usr/share/doc/nginx-1.16.1/README/usr/share/doc/nginx-1.16.1/README.dynamic/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10# 动态资源目录/usr/share/nginx/html/404.html/usr/share/nginx/html/50x.html/usr/share/nginx/html/index.html# 寄存Nginx日志文件/var/log/nginx
次要关注的文件夹有两个:
  • /etc/nginx/conf.d/是子配置项存放处,/etc/nginx/nginx.conf 主配置文件会默认把这个文件夹中所有子配置项都引入;
  • /usr/share/nginx/html/动态文件都放在这个文件夹,也能够依据你本人的习惯放在其余中央;

Nginx 常用命令

systemctl 系统命令:
# 开机配置systemctl enable nginx # 开机主动启动systemctl disable nginx # 敞开开机主动启动# 启动Nginxsystemctl start nginx # 启动Nginx胜利后,能够间接拜访主机IP,此时会展现Nginx默认页面# 进行Nginxsystemctl stop nginx# 重启Nginxsystemctl restart nginx# 从新加载Nginxsystemctl reload nginx# 查看 Nginx 运行状态systemctl status nginx# 查看Nginx过程ps -ef | grep nginx# 杀死Nginx过程kill -9 pid # 依据下面查看到的Nginx过程号,杀死Nginx过程,-9 示意强制完结过程
Nginx 应用程序命令:
nginx -s reload  # 向主过程发送信号,从新加载配置文件,热重启nginx -s reopen  # 重启 Nginxnginx -s stop    # 疾速敞开nginx -s quit    # 期待工作过程解决实现后敞开nginx -T         # 查看以后 Nginx 最终的配置nginx -t         # 查看配置是否有问题

Nginx 配置文件

Nginx 的配置文件构造如下:

# main段配置信息user  nginx;                        # 运行用户,默认即是nginx,能够不进行设置worker_processes  auto;             # Nginx 过程数,个别设置为和 CPU 核数一样error_log  /var/log/nginx/error.log warn;   # Nginx 的谬误日志寄存目录pid        /var/run/nginx.pid;      # Nginx 服务启动时的 pid 寄存地位# events段配置信息events {    use epoll;     # 应用epoll的I/O模型(如果你不晓得Nginx该应用哪种轮询办法,会主动抉择一个最适宜你操作系统的)    worker_connections 1024;   # 每个过程容许最大并发数}# http段配置信息# 配置应用最频繁的局部,代理、缓存、日志定义等绝大多数性能和第三方模块的配置都在这里设置http {     # 设置日志模式    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  /var/log/nginx/access.log  main;   # Nginx拜访日志寄存地位    sendfile            on;   # 开启高效传输模式    tcp_nopush          on;   # 缩小网络报文段的数量    tcp_nodelay         on;    keepalive_timeout   65;   # 放弃连贯的工夫,也叫超时工夫,单位秒    types_hash_max_size 2048;    include             /etc/nginx/mime.types;      # 文件扩展名与类型映射表    default_type        application/octet-stream;   # 默认文件类型    include /etc/nginx/conf.d/*.conf;   # 加载子配置项        # server段配置信息    server {     listen       80;       # 配置监听的端口     server_name  localhost;    # 配置的域名           # location段配置信息     location / {      root   /usr/share/nginx/html;  # 网站根目录      index  index.html index.htm;   # 默认首页文件      deny 172.168.22.11;   # 禁止拜访的ip地址,能够为all      allow 172.168.33.44;# 容许拜访的ip地址,能够为all     }          error_page 500 502 503 504 /50x.html;  # 默认50x对应的拜访页面     error_page 400 404 error.html;   # 同上    }}
  • main 全局配置,对全局失效;
  • events 配置影响 Nginx 服务器与用户的网络连接;
  • http 配置代理,缓存,日志定义等绝大多数性能和第三方模块的配置;
  • server 配置虚拟主机的相干参数,一个 http 块中能够有多个 server 块;
  • location 用于配置匹配的 uri ;
  • upstream 配置后端服务器具体地址,负载平衡配置不可或缺的局部;

更多对于Nginx配置文件的介绍能够参考下列文章:

  • 史上最全的Nginx配置参数中文阐明
  • Nginx 罕用配置汇总!从入门到干活足矣
  • Nginx 实际:location 门路匹配

如果你平时配置Nginx比拟频繁,我举荐你应用这个神器:弱小!Nginx 配置在线一键生成“神器”

Nginx罕用的内置变量

Nginx 的过程模型

Nginx 服务器,失常运行过程中:
  • 多过程:一个 Master 过程、多个 Worker 过程
  • Master 过程:治理 Worker 过程
  • 对外接口:接管内部的操作(信号)
  • 对内转发:依据内部的操作的不同,通过信号治理 Worker
  • 监控:监控 worker 过程的运行状态,worker 过程异样终止后,主动重启 worker 过程
  • Worker 过程:所有 Worker 过程都是平等的
  • 理论解决:网络申请,由 Worker 过程解决;
  • Worker 过程数量:在 nginx.conf 中配置,个别设置为外围数,充分利用 CPU 资源,同时,防止过程数量过多,防止过程竞争 CPU 资源,减少上下文切换的损耗。

为什么Nginx性能如此弱小,能够参考:

  • Nginx为什么高效?一文搞明确Nginx外围原理
  • 从 Nginx 优良的外围架构设计,揭秘其为何能反对高并发?

Nginx优化配置

其实核心内容次要是通过批改 Nginx 配置文件来进行调优的!

  • Nginx优化配置详解
  • 减速 Nginx 响应的 5 个措施!

在咱们的日常工作学习中,咱们会该如何去优化本人的Nginx服务器?遇到以下问题咱们该如何解决呢?

  • 如何自定义返回给客户端的404谬误页面
  • 如何查看服务器状态信息
  • 如何优化Nginx并发量
  • .......

这些问题都能够参考这篇文章的解决方案:Nginx 高性能优化配置实战总结

Nginx 是如何实现并发的?为什么 Nginx 不应用多线程?Nginx常见的优化伎俩有哪些?502谬误可能起因有哪些?这种面试问题你必定是常常被问到

所以,Nginx 如何实现高并发?常见的优化伎俩有哪些?

对于Nginx服务器的平安,在日常应用中也是十分重要的,这里给大家分享一点实践经验:如何构建高效平安的Nginx Web服务器

最初给大家分享2个基于HTTPS优化案例:

  • 基于 Nginx 的 HTTPS 性能优化实际
  • 高性能 Nginx HTTPS 调优!为 HTTPS 提速 30%

Nginx 日志相干

介绍完了装置、配置、优化这些罕用的场景之后,日志这块也是十分重要的,大家都晓得日常排错,日志起着无足轻重的作用。

Nginx日志次要分为两种:access_log(拜访日志)和error_log(谬误日志)。通过拜访日志咱们能够失去用户的IP地址、浏览器的信息,申请的解决工夫等信息。谬误日志记录了拜访出错的信息,能够帮忙咱们定位谬误的起因。

error_log  /var/log/nginx/error.log warn;#配置谬误日志的级别及存储目录events {    worker_connections  1024;}http {..................    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  /var/log/nginx/access.log main;    #配置拜访日志存储目录}

对于Nginx日志的配置实际看这篇:Nginx 日志配置实际!超具体

因为nginx功能强大,性能突出,越来越多的web利用采纳nginx作为http和反向代理的web服务器。而nginx的拜访日志不论是做用户行为剖析还是平安剖析都是十分重要的数据源之一。如何无效便捷的采集nginx的日志进行无效的剖析成为大家关注的问题。

通过几个实例来介绍如何通过filebeat、logstash、rsyslog采集nginx的拜访日志和谬误日志,我也能够:利用ELK剖析Nginx日志。

Nginx版本升级

这里咱们来聊一聊,在企业理论生产环境中常常遇到的一个状况,如何降级Nginx到新的版本和如何回滚至旧版本。

版本升级其实就是针对二进制文件的降级,过程如下:

[root@nginx ~]# /usr/local/nginx-1.12.2/sbin/nginx -vnginx version: nginx/1.12.2[root@nginx ~]# cd /usr/local/nginx-1.12.2/sbin/[root@nginx sbin]# mv nginx nginx-1.12.2#首先备份原来的旧版本nginx二进制文件[root@nginx sbin]# cp /usr/local/nginx-1.14.2/sbin/nginx ./#拷贝新版本的二进制文件到当前目录

:其实降级新版本,最重要的就是平滑降级,让前端用户无感知(也就是不中断服务,这个其实不难,生产中多台顺次灰度降级)。

对于降级来说,最难的不是降级,而是回滚,因为在理论生产环境回滚的机率是存在,比方:新版本因为某些未知bug导致与现有利用不兼容、或呈现运行不稳固的状况等等。

所以,对于咱们来说,故障回滚是重点。这里给大家举荐我总结的:1分钟搞定 Nginx 版本的平滑降级与回滚

Nginx 反向代理与负载平衡

反向代理简介

反向代理(Reverse Proxy)形式是指以代理服务器来承受internet上的连贯申请,而后将申请转发给外部网络上的服务器,并将从服务器上失去的后果返回给internet上申请连贯的客户端,此时代理服务器对外就体现为一个反向代理服务器。反向代理是为服务端服务的,反向代理能够帮忙服务器接管来自客户端的申请,帮忙服务器做申请转发,负载平衡等。

反向代理对服务端是通明的,对咱们是非通明的,即咱们并不知道本人拜访的是代理服务器,而服务器晓得反向代理在为他服务。

配置实例
http {.............    upstream product_server{        127.0.0.1:8081;    }    upstream admin_server{        127.0.0.1:8082;    }    upstream test_server{        127.0.0.1:8083;    }server {        #默认指向product的server  location / {      proxy_pass http://product_server;      }  location /product/{      proxy_pass http://product_server;     }  location /admin/ {      proxy_pass http://admin_server;     }  location /test/ {      proxy_pass http://test_server;      }    }}

如果你对Nginx 配置中location 的规定不太熟悉,举荐你看看这篇文章:Nginx 实际:location 门路匹配。nginx 每个location都是一个匹配目录,nginx的策略是:拜访申请来时,会对拜访地址进行解析,从上到下一一匹配,匹配上就执行对应location大括号中的策略,并依据策略对申请作出相应。

所以,有时候就因为在配置时,少些了一个字符“/”,就造成拜访不通报错,这种问题是十分觉的故障起因之一,正所谓:Nginx配置中一个不起眼字符"/"的巨大作用,失之毫厘谬以千里,这篇文章具体进了相干的阐明与举例验证。

反向代理的劣势:
  • 暗藏实在服务器;
  • 负载平衡便于横向裁减后端动静服务;
  • 动静拆散,晋升零碎健壮性;
Nginx 负载平衡

nginx能实现负载平衡,什么是负载平衡呢?就是说利用部署在不同的服务器上,然而通过对立的域名进入,nginx则对申请进行散发,将申请散发到不同的服务器下来解决,这样就能够无效的加重了单台服务器的压力。

配置实例
upstream server_pools {   server 192.168.1.11:8880   weight=5;  server 192.168.1.12:9990   weight=1;  server 192.168.1.13:8989   weight=6;  #weigth参数示意权值,权值越高被调配到的几率越大}server {    listen 80;   server_name mingongge.com;  location / {      proxy_pass http://server_pools;    }}
Nginx 实现负载平衡的策略
  • 轮询策略:默认状况下采纳的策略,将所有客户端申请轮询调配给服务端。这种策略是能够失常工作的,然而如果其中某一台服务器压力太大,呈现提早,会影响所有调配在这台服务器下的用户。
  • 最小连接数策略:将申请优先调配给压力较小的服务器,它能够均衡每个队列的长度,并防止向压力大的服务器增加更多的申请。
  • 最快响应工夫策略:优先调配给响应工夫最短的服务器。
  • 客户端 ip 绑定策略:来自同一个 ip 的申请永远只调配一台服务器,无效解决了动静网页存在的 session 共享问题。

想要高可用?搞定负载平衡架构是要害,

对于负载平衡和反向代理的区别能够参考:一文详解负载平衡和反向代理的实在区别,对于 nginx 反向代理和负载平衡策略 实战案例。

Nginx 动静拆散

Nginx动静拆散是让动静网站里的动静网页依据肯定规定把不变的资源和常常变的资源辨别开来,动静资源做好了拆分当前,咱们就能够依据动态资源的特点将其做缓存操作,这就是网站动态化解决的外围思路。举荐:CentOS 7.3:LAMP 动静拆散部署能够理解一下Apache的配置,而后再回过头了解Nginx的动静拆散可更直观。

server {  listen 80;  server_name mingongge.com;  location /static {        root /wwww/web/web_static_site;   }}

也能够应用上面的办法

location /image { alias /web/nginx/static/image/;}留神:应用alias开端肯定要增加/,并且它只能位于location中

应用前后端拆散后,能够很大水平晋升动态资源的访问速度,即便动静服务不可用,动态资源的拜访也不会受到影响。

小试牛刀!Nginx 搭建动态资源服务器,这篇文章是给大家介绍整个搭建过程,十分具体。

Nginx 高级性能

除了负载平衡,Nginx还能够做很多,限流、缓存、黑白名单等

重定向配置
location / { return 404; #间接返回状态码}location / { return 404 "pages not found"; #返回状态码 + 一段文本}location / { return 302 /blog ; #返回状态码 + 重定向地址}location / { return https://www.mingongge.com ; #返回重定向地址}

示例如下

server { listen 80;server_name www.mingongge.com;return 301 http://mingongge.com$request_uri;}server {listen 80; server_name www.mingongge.com; location /cn-url {    return 301 http://mingongge.com.cn;    }}server{  listen 80;  server_name mingongge.com; # 要在本地hosts文件进行配置  root html;  location /search {   rewrite ^/(.*) https://www.mingongge.com redirect;  }    location /images {   rewrite /images/(.*) /pics/$1;  }    location /pics {   rewrite /pics/(.*) /photos/$1;  }    location /photos {    }}
流量拷贝

需要:将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多益处,比方:

  • 能够验证性能是否失常,以及服务的性能;
  • 用真实有效的流量申请去验证,又不必造数据,不影响线上失常拜访;
  • 这跟灰度公布还不太一样,镜像流量不会影响实在流量;
  • 能够用来排查线上问题;
  • 重构,如果服务做了重构,这也是一种测试形式;

为了实现流量拷贝,Nginx提供了ngx_http_mirror_module模块,这就是 Nginx 又一牛X的性能!流量拷贝

限流

Nginx按申请速率限速模块应用的是漏桶算法,即可能强行保障申请的实时处理速度不会超过设置的阈值。

Nginx官网版本限度IP的连贯和并发别离有两个模块:

  • limit_req_zone 用来限度单位工夫内的申请数,即速率限度,采纳的漏桶算法 "leaky bucket"。
  • limit_req_conn 用来限度同一时间连接数,即并发限度。

葵花宝典!一文搞定 Nginx 限流配置

缓存

Nginx 缓存作为性能优化的一个重要伎俩,能够极大加重后端服务器的负载。上面咱们将介绍 Nginx 缓存配置的相干指令以及 http 缓存机制,以及 Nginx 缓存实际案例剖析。

可参考:Nginx 缓存机制详解!

灰度公布

执行过程:

  • 当用户申请达到前端代理服务Nginx,内嵌的lua模块解析Nginx配置文件中的lua脚本代码;
  • Lua变量取得客户端IP地址,去查问memcached缓存内是否有该键值,如果有返回值执行@client_test,否则执行@client。
  • Location @client_test把申请转发给部署了new版代码的服务器,location @client把申请转发给部署了normal版代码的服务器,服务器返回后果。整个过程实现。

上面是装置配置过程具体过程:基于 Nginx+lua+Memcache 实现灰度公布

这里还给大家举荐一篇文章:基于 Nginx 实现灰度公布与 AB 测试

封杀歹意拜访

看了 nginx 的拜访日志,发现每天有好多国外的 IP 地址来拜访我的网站,并且拜访的内容基本上都是歹意的。因而我决定禁止国外 IP 来拜访我的网站

想要实现这个性能有很多办法,上面我就来介绍基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 拜访网站。具体的解决方案配置如:通过 Nginx 来实现封杀歹意拜访

Nginx+keepalived 实现高可用

Keepalived软件起初是专为LVS负载平衡软件设计的,用来治理并监控LVS集群零碎中各个服务节点的状态,起初又退出了能够实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚构路由器冗余协定)性能。因而,Keepalived除了可能治理LVS软件外,还能够作为其余服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。keepalived高可用集群服务

装置及配置过程请参考:Nginx+keepalived 实现高可用,防盗链及动静拆散配置,写得太好了!

Nginx 终极指南

介绍用来进步Nginx服务器的安全性,稳定性和性能的12种操作。

  • 放弃Nginx的及时降级
  • 去掉不必的Nginx模块
  • 禁用server_tokens项
  • 禁止非法的HTTP User Agents
  • 禁掉不须要的 HTTP 办法
  • 设置缓冲区容量下限
  • 限度最大连接数
  • 设置日志监控
  • 阻止图片外链
  • 禁止 SSL 并且只关上 TLS
  • 证书加密(HTTPS)
  • 重定向HTTP申请到HTTPS

以上12个具体的配置过程可参考:进步Nginx服务器硬度的12个技巧

Nginx 监控

监控Web服务器对于查看网站上产生的状况至关重要。关注最多的便是日志变动,查看实时日志文件变动大家第一反馈应该是'tail -f /path/to/log'命令吧,然而如果每个网站的拜访日志都是应用这种形式查看也是相当解体的,明天小编就跟大家分享一个弱小的Nginx日志监控工具。

一个小工具帮你搞定实时监控Nginx服务器

日常生产环境搭建了Nginx集群后,就须要持续深入研究的就是日常Nginx监控。Nginx如何监控?置信百度就能够找到:nginx-status

通过Nginx-status,实时获取到Nginx监控数据后,如何和现有监控系统集成?一个很好的解决方案:Nginx+Telegraf+Influxdb+Grafana

即通过Telegraf监控插件定时收集Nginx的监控状态,存储到时序数据库Influxdb中,而后通过Grafana展示即可。

这是我发现的又一款治理神器,能够实现配置管理,和性能监控。具体的装置与配置过程,在这篇文章:又一款 Nginx 治理可视化神器!配置、监控一条龙 中介绍过了。

Nginx 常识体系动静更新地址

对于Nginx 常识体系动静更新地址,大家能够继续关注民工哥技术之路公众号,而后查阅 Nginx 技术专栏 能够实时查看更新的文章,无论是学习、还是查漏补缺都是十分实用的技术手册。