Nginx教程

Nginx总结

本文主要是介绍Nginx总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Nginx总结

-1.前言

之前一直咕掉了, 这次把许多优质内容总结下,许多来自其他大佬的文章,底部有文章链接。

  • 反向代理
  • 负载均衡
  • 动静分离

0.基本介绍

1.Web 服务器:

相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.

2.负载均衡服务器

支持作为 HTTP代理服务器对外进行服务。Nginx用C编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

3.作为邮件代理服务器

Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验.

4.优势

安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器, Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。

1.基础内容

nginx  #启动nginx
nginx -s reload  #根据最新配置重启nginx
nginx -s stop  #立即停止nginx
nginx -s quit #安全退出
nginx -c /特定目录/nginx.conf  #以指定配置启动nginx
nginx -t #检查配置是否正确
nginx -t -c /特定目录/nginx.conf  #检查特定配置是否正确
nginx -v #查看版本信息

Nginx默认的配置文件主要有 main、events、http、server、location 五个块组成。其中 http 、server、location 属于嵌套关系。

  • main:主要控制Nginx子进程所属的用户和用户组、派生子进程数、错误日志位置与级别、pid位置、子进程优先级、进程对应cpu、进程能够打开的文件描述符数目等。
  • events:控制Nginx处理连接的方式。
  • http:Nginx处理http请求的主要配置块。
  • server:Nginx中主机配置块,可用于配置多个虚拟主机。
  • location:server中对应目录级别的控制块,可以有多个。

(0)关于nginx配置的一些说明

语句说明
user nginx nginx ;Nginx用户及组:用户 组。window下不指定
worker_processes 8;工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。
error_log logs/error.log;错误日志:存放路径。
pid logs/nginx.pid;pid(进程标识符):存放路径。
worker_rlimit_nofile 204800;指定进程可以打开的最大描述符:数目。现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
use epoll;使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
worker_connections 204800;没个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。worker_processes*worker_connections
keepalive_timeout 60;keepalive超时时间。
client_header_buffer_size 4k;客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
include mime.types;设定mime类型,类型由mime.type文件定义

请添加图片描述

​ 通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add$拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

#运行用户
user nobody;
#工作进程数
worker_processes  1;
#全局错误日志及PID文件
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
#工作模式及连接数上限
events {
    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,
    #仅用于linux2.6以上内核,可以大大提高nginx的性能
    use   epoll; 
    #单个后台worker process进程的最大并发链接数    
    worker_connections  1024;
}
http {
    #设定mime类型,类型由mime.type文件定义
    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 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    #对于普通应用,必须设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
    #以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile     on;
    #tcp_nopush     on;
    #连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay     on;
    #开启gzip压缩
    gzip  on;
    gzip_disable "MSIE [1-6].";
    #设定请求缓冲
    client_header_buffer_size    128k;
    large_client_header_buffers  4 128k;
    #设定虚拟主机配置
    server {
        #侦听80端口
        listen    80;
        #定义使用 www.nginx.cn访问
        server_name  www.nginx.cn;
        #定义服务器的默认网站根目录位置
        root html;
        #设定本虚拟主机的访问日志
        access_log  logs/nginx.access.log  main;
        #默认请求
        location / {
            #定义首页索引文件的名称
            index index.php index.html index.htm;   
        }
        # 定义错误提示页面
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
        }
        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            #过期30天,静态文件不怎么更新,过期可以设大一点,
            #如果频繁更新,则可以设置得小一点。
            expires 30d;
        }
        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ .php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
        #禁止访问 .htxxx 文件
            location ~ /.ht {
            deny all;
        }
    }
}

(1)关于location

​ 其中location根据不同前缀的使用方式,大致分为普通location和正则location。多个正则location之间会按照先后顺序进行匹配,匹配成功后,就不会继续匹配后面定义的location。多个普通location之间遵循“最大匹配原则”,匹配度最高的location将会被执行,同时也可以利用 =精准匹配和 ^~非正则匹配可以在正则匹配之前优先匹配,禁止执行原有的正则匹配。因此 当多种类型的 location 匹配同时出现时,最终执行结果为“= ”匹配优先于"~"匹配,“~”匹配优先于正则匹配,正则匹配优先于普通的最大前缀匹配 只要优先的location 匹配成功,就不会执行其他的location 。

​ location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
即:此模块专门将请求导向其他服务。

语法

请添加图片描述

1.精确匹配

location = / {
   #精确匹配访问网站根目录
}
location = /login {
   #精确匹配http://xxx.com/login
}

2. ^~ 表示以什么打头,关键在于正则的开头符 ^

location ^~ /static/ {
   #以/static打头,比如 http://xxx.com/static/jQuery.js
}

3. 正则匹配(~ 区分大小写的正则, ~* 不区分大小的正则)

location ~ \.png {
    #以png结尾,比如比如 http://xxx.com/img/a.png
}
location ~* \.png$ {
    #以png或者PNG或者Png等等结尾,比如比如 http://xxx.com/img/a.pNg。如果是png结尾,会优先匹配上面一条。
}

4.排除法的正则,同样区分大小写优先于不区分大小写

location !~ \.png$ {
   #匹配“以png结尾”失败,进入location,那就情况多了去了,只要不以png结尾就行
}
location !~* \.xhtml$ {
   #匹配“以png或者PNG或者PnG等等”结尾失败,进入location,那情况也多了去了,只要不是PNG的各种大小写变体就行
}

5. 通用匹配

location / {
   #用来兜底的,当前面其他所有的规则都不满足条件,就归入这个通用的
}

请添加图片描述

总结就是如果 p r o x y _ p a s s proxy\_pass proxy_pass 结尾加上 / / /则是绝对根路径,不会把匹配的路径部分带走,否则会带走。


(2)缓冲

nginx也提供了缓冲的机制,用于提高性能。没有缓冲的情况下,数据直接从后端服务器发送给客户端。缓冲的作用是在nginx上临时存储来自后端服务器的处理结果,从而可以提早关闭nginx到后端的连接,减少IO的损耗。一般内容存放在内存当中,但当内容过多,造成的内存不够时,会把内容存放在临时文件目录下。

(3)nginx配置多个配置文件

​ 需要在server中加:include config/*.conf;

(4)跨域

​ 跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

2.反向代理

​ 对于一个大型网站来说,随着网站访问量的快速增长,单台服务器已经无法承担大量用户的并发访问,必须以增加服务器的方式,提高计算机系统的处理能力,计算速度,进而满足当前业务量的需求。那么如何实现服务器之间的协同功能呢?Nginx提供的反向代理负载均衡功能是一个很好的解决方案。

​ nginx的代理过程,就是将请求发送给nginx,然后将请求转发给后端服务器,后端服务器处理完毕之后将结果再发给nginx,nginx再把结果发送给客户端。后端服务器可在远程也可在本地,也可以是nginx服务器内部定义的其他虚拟主机。这些接收nginx转发的服务器被称为上游(upstream)使用nginx做代理的目的之一是扩展基础架构的规模。nginx可以处理大量并发连接,请求到来后,nginx可将其转发给任意数量的后台服务器进行处理,这等于将负载均衡分散到整个集群。

在Nginx服务器中,反向代理的配置非常简单,最主要的指令就是“proxy_pass”,用于设置后端服务器的地址。

server {
        listen       80;
       server_name  localhost;
       location / { 
       proxy_pass http://localhost:9000;
    }
}

3.负载均衡

负载均衡就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。

Nginx默认支持轮询、权重、ip Hash等多种负载均衡策略。

  • 轮询:默认设置方式,每个请求按时间顺序逐一分配到不同的后端服务器进行处理,可以自动剔除宕机服务器。
  • 权重方式:利用weight指定轮询的权重比率,用于后端服务器性能不均的情况。
  • ip_hash方式:每个请求按照IP的hash结果分配,这样可以让每个访客每次请求都访问同一个后端服务器,可以解决session共享的问题。
  • 第三方模块:fair或url_hash等策略,nginx本身不包含该实现,需要下载对应的软件包。

客户端访问nginx的时候,只需要配置一个ip和一个端口,nginx帮助我们把请求转发不同的后台服务中。

如上配置 所有 http://localhost:80的请求都会被转发到http://localhost:9000。

在这里插入图片描述


轮询配置

server {
        listen       80;
       server_name  localhost;
       location / { 
       proxy_pass http://web_server;
    }
}
#配置负载均衡服务器组 轮询方式
upstream web_server
{
      server  192.168.78.128;
      server   192.168.78.129;
}

权重方式配置

upstream web_server1
{
      server  192.168.78.128 weight=1;
      server   192.168.78.129 weight=3;
}

upstream web_server2
{
      server  192.168.78.128 weight=1 max_fails=1 fail_timeout=2;
      server   192.168.78.129 weight=3;
     server 192.168.78.130   backup;
}

按上图web_server1配置后,3/4的流量会转发到192.168.78.129的服务器上,1/4的流量会转发到192.168.78.128的服务器上,web_server2的配置表示 nginx在2s内发现后端服务异常达到max_fails次,就将该服务器标记为不可用。backup标记为预留的备份机器,当上面上个服务都宕机时,会将流量转发到备份机器。

IP Hash方式

upstream web_server1
{
      ip_hash;
      server  192.168.78.128;
      server   192.168.78.129;
      server   192.168.78.130 down;
}

down参数可以将服务器标记为下线状态,在路由分配时,会忽略该服务器。

参考文章

传送门1

传送门2

传送门3

传送门4

这篇关于Nginx总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!