nginx 详解

1 nginx是什么

nginx是由俄罗斯人发明的一款高性能的web服务器,它同早期的Apache,IIS,Lighttpd等都具有web服务器的功能,能够发布网站代码等资源,为用户提供信息资讯。但是nginx的功能不单单只是做为web服务器,它还可以用来做反向代理和负载均衡服务器,并且整体性能非常强大,在web前端服务器目前是企业的首选。

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器

2 nginx能做什么

2.1 nginx可以做反向代理

nginx的反向代理是nginx的是个非常重要的功能,它可以隐藏后端服务器的数量,并且保证后端服务器免受攻击

2.2 nginx可以做负载均衡

nginx的负载均衡其实是反向代理的延伸,当单台后端服务器无法处理前端庞大的请求时,可以为后端多准备几台服务器,共同分摊流量,这就是负载均衡,也叫均衡负载

2.3 nginx可以做域名重定向

重定向也是web服务器非常重要的功能,我来举一个例子:假设你们公司现在有一个域名,很多老用户已经习惯了是这个域名来访问你们的网站。但是你们公司经过改造,需要更换域名,这时就会面临丢失很多老用户的问题。那么这个问题通过nginxd的重定向就可以解决,我们只需要把访问老域名的流量重定向新域名就可以了。这个技术的实战,运维朱工会在后面通过实例演示。

除了做域名重定向,还有内部重定向,比如用户访问到没有的资源,我们希望给用户返回指导用户或者首页。这时,就可以写内部重定向实现了。

2.4 nginx可以做动静分离

nignx的动静分离其实也是nginx的反向代理的功能,只是它很强大和特别,所以一般单独拿出来说。因为nginx处理静态资源的能力非常强,效率非常高。所以很多时候,我们会将用户请求的静态资源直接交由nginx代理服务器处理,然后把动态的应用程序代理到后端,给应用服务器处理,以此来提高用户体验。

2.5 其他功能

nginx还有很多强大的功能,比如做缓存服务器,邮件代理服务器,还可以做微服务网关等。所以这么一个强大的服务应用

3 nginx的优点

3.1 速度更快并发更高

单次请求或者高并发请求的环境下,Nginx都会比其他Web服务器响应的速度更快。一方面在正常情况下,单次请求会得到更快的响应,另一方面,在高峰期(如有数以万计的并发请求),Nginx比其他Web服务器更快的响应请求。Nginx之所以有这么高的并发处理能力和这么好的性能原因在于Nginx采用了多进程和I/O多路复用(epoll)的底层实现。

3.2 配置简单扩展性强

Nginx的设计极具扩展性,它本身就是由很多模块组成,这些模块的使用可以通过配置文件的配置来添加。这些模块有官方提供的也有第三方提供的模块,如果需要完全可以开发服务自己业务特性的定制模块。

3.3 高可靠性

Nginx采用的是多进程模式运行,其中有一个master主进程和N多个worker进程,worker进程的数量我们可以手动设置,每个worker进程之间都是相互独立提供服务,并且master主进程可以在某一个worker进程出错时,快速去"拉起"新的worker进程提供服务。

3.4 热部署

现在互联网项目都要求以7*24小时进行服务的提供,针对于这一要求,Nginx也提供了热部署功能,即可以在Nginx不停止的情况下,对Nginx进行文件升级、更新配置和更换日志文件等功能。

3.5 成本低代码开源

3.6 配置简单

4 nginx的缺点

4.1 Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点

4.2 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测

4.3 不支持Session的直接保持,但能通过ip_hash来解决。

5 nginx目录文件说明

5.1 conf目录

存放nginx配置文件的目录

  • fastcgi.conf:存放fastcgi 相关的配置
  • fastcgi.conf.default:fastcgi.conf 的原始备份文件,用于还原
  • fastcgi_params:fastcgi 相关参数文件
  • fastcgi_params.default:fastcgi_params 的原始备份文件,用于还原
  • koi-utf:编码转换映射文件
  • koi-win:编码转换映射文件
  • mime.types:存放媒体资源的类型,例如:xml、html、css
  • mime.types.default:mime.types 的原始备份文件,用于还原
  • nginx.conf:nginx 默认主配置文件
  • nginx.conf.default:nginx.conf 的原始备份文件,用于还原
  • scgi_params:与fastcgi_params一样,传递哪些服务器的变量
  • scgi_params.default:scgi_params 的原始备份文件,用于还原
  • uwsgi_params:服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回
  • uwsgi_params.default:uwsgi_params 的原始备份文件,用于还原
  • win-utf:编码转换映射文件

5.2 fastcgi_temp目录

  • fastcgi_temp:临时存放fastcgi 数据的目录

5.3 html目录

网站的根目录,访问的网站页面信息都存放在这个目录下

  • 50x.html:网站的错误页面,所以500的错误页面

  • idnex.html:默认首页

5.4 logs目录

  • access.log:访问日志,记录访问 nginx 页面的信息,包括IP地址、谁来访问的、访问的页面、响应状态码等
  • error.log:错误日志,nginx 的错误文件,启动错误,就看这个日志
  • nginx.pid:nginx 的 pid 进程号

5.5 proxy_temp目录

  • proxy_temp:代理的数据临时存放的目录

5.6 sbin目录

  • nginx:nginx启动命令

6 nginx.conf文件详解

nginx.conf文件主要分为三部分组成

6.1全局块:

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

比如文件第一行的配置的;

Worker_processes   1;  #启动工作进程数数量,一般设置和CPU核心数一致

这是nginx服务器并发处理服务的关键配置,worker_process 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。

6.2 events块:

比如文件中的配置:

events{​ 复制代码
events{
     worker_connectiaons  1024;  #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数
}

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

上述的例子表示每个work process 支持的最大连接数为1024

这部分的配置对nginx的性能影响较大,在实际中应该灵活配置

6.3 htttp块

shell 复制代码
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;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #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;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

​ http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,http块可以包含多个server块,而一个server块中又可以包含多个location块,server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。

  • og_format:指定日志格式

  • $remote_addr:远程客户端的IP地址

  • $remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白

  • $time_local: 访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时

  • $request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求

  • $status:记录请求返回的http状态码,比如成功是200

  • $body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量

  • $http_referer:记录从哪个页面链接访问过来的(请求头Referer的内容 )

  • $http_user_agent:客户端浏览器信息(请求头User-Agent的内容 )

  • $http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过

  • $remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加 x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端请求的服务器地址。

    location ~ .php$ {
    root html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.ph p;
    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    include fastcgi.conf;

localtion 字段含义:" ~ " 区分大小写," .php$ " 转义字符含义," . " 在正则里面表示任意所有,通过 \ 转义含义," $ " 以 " .php " 结尾,如果匹配到以" .php " 结尾的文件,进入到 " html " 目录去找它,这个请求通过 " fastcgi_pass " 转交给本地的9000 端口,fastcgi默认的首页是 index.php4

7 配置负载均衡策略

Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html

  • 轮循(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器宕机时,能被自动删除且请求不会受影响

  • weight权重

    指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的情况,权重越高 被访问的概率就越大

  • ip hash

    每个请求被访问ip的hash结果分配,这样每个访客访客固定访问一个后端服务器

  • fair

    动态根据后端服务器处理请求的响应时间来进行负载分配,响应时间短的优先分配,时间长的 分配的请求会减少,nginx服务默认不支持这个算法,需要安装upstream_fair模块

  • url_hash

    根据访问的UPL计算出的hash结果来分配请求,每个请求会指向固定的服务器,常用于nginx作为静态资源服务器的场景,可以提高缓存效率,nginx服务默认不支持这个算法,需要安装nginx的hash软件包

7.1 轮询配置(默认)

http {
    # ... 省略其它配置
    upstream tomcats {
        server 192.168.0.100:8080;
        server 192.168.0.101:8080;
        server example.com:8080;
    }
    server {
        listen 80;

        location / {
            proxy_pass http://tomcats;
        }
    }
    # ... 省略其它配置
}
  • proxy_pass http://tomcats:表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。
  • upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。
  • upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给100,101,102来处理,可以通过修改下面这些参数来改变默认的分配策略:

7.2 权重weight

默认为1,将请求按照权重值配置分配给每台server

下面配置,表示6次请求中,100分配2次,101分配3次,102分配1次

upstream tomcats {
    server 192.168.0.100:8080 weight=2;  # 2/6次
    server 192.168.0.101:8080 weight=3;  # 3/6次
    server 192.168.0.102:8080 weight=1;  # 1/6次
}

upstream tomcats {
    server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
    server 192.168.0.101:8080 weight=3;
    server 192.168.0.102:8080 weight=1;
}
  • max_fails 参数

    默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。

  • fail_timeout 参数

    默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它

7.3 ip hash配置

  • ip_hash是根据用户请求过来的ip,然后映射成hash值,然后分配到一个特定的服务器里面;

  • 使用ip_hash这种负载均衡以后,可以保证用户的每一次会话都只会发送到同一台特定的Tomcat里面,它的session不会跨到其他的tomcat里面去的;

  • 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

**注意:**如果有服务器宕机则需要单独的使用 down 标识出来,不能直接删除配置代码,如果删除会导致nginx的hash算法重新计算,那么用户的回话或者缓存会失效掉,所以如果不需要这台服务器直接修改为 down 即可,也就是 server 192.168.0.102:8080 down;

upstream tomcats {
	ip_hash;
    server 192.168.0.100:8080;
    server 192.168.0.101:8080;
    server 192.168.0.102:8080 down;
}

8 响应码说明

  • HTTP响应状态码

    100-199:指客户端的响应动作

    200-299:响应成功

    300-399:文件或者目录发生了移动

    400-499:客户端的错误

    500-599:服务端的错误

  • 常见的响应状态码

    200:OK,访问成功

    301:Moved,永久跳转,请求的页面已经被重新定义到其他位置

    403:Forbidden,禁止访问,权限不够,检测网站根目录的权限

    404:Not Found,未找到页面,路径不对、文件名不对、服务器上没有这个路径或者文件

    500:Iternal server error,开启selinux 可能会导致

    502:Bad Gateway,代理服务器有问题,nginx+php 转发的时候可能会出,转发的后端服务器没有找到,或者转发不对都可能导致这个问题

    504:Gateway timeout,网关代理服务器请求后端服务器的时候,没有在指定的范围内完成解析,就会报错504

相关推荐
苹果醋321 分钟前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
CCSBRIDGE2 小时前
Magento2项目部署笔记
笔记
爱吃西瓜的小菜鸡2 小时前
【C语言】判断回文
c语言·学习·算法
小A1593 小时前
STM32完全学习——SPI接口的FLASH(DMA模式)
stm32·嵌入式硬件·学习
亦枫Leonlew3 小时前
微积分复习笔记 Calculus Volume 2 - 5.1 Sequences
笔记·数学·微积分
岁岁岁平安3 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA3 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
qq_589568103 小时前
数据可视化echarts学习笔记
学习·信息可视化·echarts
爱码小白3 小时前
网络编程(王铭东老师)笔记
服务器·网络·笔记
LuH11244 小时前
【论文阅读笔记】Learning to sample
论文阅读·笔记·图形渲染·点云