Nginx基础架构和配置

特性

  1. 模块化设计,较好的扩展性,动态加载。
  2. 高可用性
  3. 支持热部署,不停机更新配置文件,升级版本,更换日志文件。
  4. 低内存消耗,10k keep-alive连接在非活动模式下大概2.5M。
  5. 事件驱动模型,Aio,mmap,sendfile。

传统网络传输过程

硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈

  1. 系统调用 read()产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。
  2. 数据从 kernel buffer拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode。
  3. 系统调用write()产生一个上下文切换:从 user mode切换到 kernel mode,然后把步骤2读到 user buffer的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket相关联。
  4. 系统调用 write()返回,产生一个上下文切换:从 kernel mode 切换到 user mode ,然后 DMA 从 kernel buffer拷贝数据到协议栈。

开启sendfile后

硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈

  1. 系统调用sendfile()通过 DMA把硬盘数据拷贝到 kernel buffer,然后数据被 kernel直接拷贝到另外一个与 socket相关的 kernel buffer。这里没有 user mode和 kernel mode之间的切换,在 kernel中直接完成了从一个 buffer到另一个 buffer的拷贝。
  2. DMA 把数据从 kernelbuffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。
  3. sendfile是个比 read 和 write 更高性能的系统接口,sendfile 是将 in_fd 的内容发送到 out_fd ,而 in_fd 不能是 socket ,也就是只能文件句柄。
  4. 当 Nginx 是一个静态文件服务器的时候,开启 SENDFILE 配置项能大大提高 Nginx 的性能。
  5. 是当 Nginx 是作为一个反向代理来使用的时候,SENDFILE 则没什么用了,因为 Nginx 是反向代理的时候。 in_fd 就不是文件句柄而是 socket,此时就不符合 sendfile 函数的参数要求了。

综上所述,sendfile只能接受句柄参数,不能接收socket文件,静态服务器时开启可以大幅度提升性能,反向代理时由于传输socket,就无需开启了。

Nginx基本功能

  1. 静态资源的web服务器,不支持模块方式php,仅支持安装php-fpm(Tcp:9000,FastCGI通信方式),Apache内部有支持php的模块。
  2. 反向代理服务器,后端搭建多个web服务器,由Nginx进行七层调度,比LVS功能强,但是性能弱,LVS理论并发400万,Nginx 3万。
  3. LNMP架构中,如果想访问动态资源,FastCGI作为服务端,Nginx作为客户端;结构应该为 客户端–>Nginx服务器–>php-fpm–>DB。
  4. uWSGI Django架构服务器,类似LNMP,PHP换成Python:客户端–>Nginx服务器–>(Django,通信方式为uWCGI)python–>DB。
  5. 动态加载卸载模块。

Web服务器功能

  1. 虚拟主机:vhosts,include.d。
  2. 支持keep-alive和管道链接。
  3. 访问日志(支持基于日志缓冲提高其性能)。
  4. url rewrite: 访问后重新导向到一个新地址。
  5. 路径别名:alias别名跳转到文件夹。
  6. IP与用户的访问控制,速度,并发链接数都可以控制。
  7. 重新配置和在线升级热操作。
  8. Memcached的GET接口。

Nginx架构

  1. Master启动并管理为数不多的worker(1C对应1worker,或者直接auto),worker不是开启很多线程,线程看不到的,而是只是各个进程进行IO多路复用。
  2. 各个worker内部包含不同的模块,完成例如http,fastcgi,memcache等功能。
  3. 提供Proxy-Cache功能,本地保留缓存,方便后续客户端进行访问,提高访问效率。
    Nginx程序结构
  4. 都是进程没有线程,IO多路复用,一个worker接收多个请求。
  5. 模块分类:核心,标准,三方
  6. 核心模块: Core Module;标准模块: HttP模块(后端http服务器),Mail模块,Stream模块(可以调度数据库);三方模块
  7. 模块太多了,对经常使用的有了解即可。

Nginx的功用

  1. 静态的Web服务器,html, jpg, css, js, txt等静态资源都可以被访问。
  2. 结合FastCGI,uWSGI,SCGI等协议方向代理动态资源请求。
  3. TCP/UDP协议的请求转发。
  4. 反向代理,Nginx后端服务器看到的ip是Nginx的,而LVS后端服务器看到的是访问客户端的,等于LVS是透明的。

Nginx源码安装shell脚本
<>后续写出来,网上多了去了,我就懒得写了

Nginx安装

  1. epel-release源已经收录,安装完成后使用 nginx -V 可以看到红帽默认开启了 TLS SNI Support enabled:一台服务器支持多个https虚拟主机,
    在Apache中,一台服务器只允许一个https虚拟主机。
  2. /etc/nginx/conf.d/.conf 支持多个虚拟主机,每个.conf文件中写一个server,在主配置文件/etc/nginx/nginx.conf里面都包含。
  3. 全局模块是处在http{…}之前的,http{}中包含很多server{…},每个server都用于定义一个虚拟主机。

Nginx全局配置

配置文件如下:

user nginx;                    //安装nginx时候就创建了
worker_processes auto;         //多少个CPU对应多少个work进程,用auto即可
worker_rlimit_nofile 65535;    //这个一定要写,支持多少用户并发

# (worker_cpu_affinity auto) 或者直接根据CPU个数绑定   //CPU绑定,提高命中缓存几率,亲缘性
# 4c: (worker_cpu_affinity 0001 0010 0100 1000)
# 8c: (worker_cpu_affinity 00000001 00000010 ...)
# ps axo pid,cmd,psr |grep nginx    //查看当前worker都是绑定在哪个CPU上的

# worker_priority <num>;     //[-20,19],指定nice值,越小优先级越高

error_log /var/log/nginx/error.log;     //错误日志所在位置,可以发送到远程日志服务器上
                //还可以定义日志级别 debug|info|notice|warn|error|crit|alert|emerg
pid /run/nginx.pid;                     //pid所在文件夹

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;    //使用include可供选择模块放在不同地方
# load_module <file>;                       //具体加载哪个模块
# daemon on|off;                            //nginx是否编程一个后台守护进程,默认就是on,
                                            //如果off后再启动nginx就会卡在界面上,适合调试测试环境
# master process on|off;                    //默认是on的,如果off,重启后只有一个nginx进程,不会出现master_worker多个进程
/* 
这段没什么说的,文件打开最大用户数和最大进程数
vim /etc/security/limit.conf 
#hard limit ,嚴格的設定,必定不能超過這個設定的數值;
#soft limit ,警告的設定,可以超過這個設定值,但是若超過則有警告訊息。 
*   soft noproc   65535  
*   hard noproc   65535  
*   soft nofile   65535  
*   hard nofile   65535 
 */
events {
    worker_connections 1024;  //每个worker支持的最大连接数,总数:worker_processes * worker_connections
    use epoll;                //默认就是epoll,写不写都行
    # accept_mutex on|off;    //默认on就好了,来了连接几个worker轮流处理,off的话则会惊群可能造成性能下降。
}

Nginx Http配置:

最重要的部分: ngx_http_core_module

一、 套接字相关配置:

   server {                           //这个可以定义在conf.d的文件夹下
       listen [:PORT]PORT;            //监听地址和端口,default为 *:80,IP:PORT也可以,可以绑定具体ip或所有ip。                 
       server_name SERVER_NAME;       //一般都是www.xx.com类似域名
       location {
      		 root /PATH/TO/HTML/LOCATION;   //可以写绝对路径,如果是相对路径要看default root是哪儿,yum安装/usr/share/nginx/html/为根目录
       }                                      
   }	                             //root 对应路径下必须为 index.html,否则403 forbbiden

listen []

  1. PORT | IP:PORT | unix:<socket location> ,这几种格式都是支持的。
  2. default_server 为关键字,一般用在listen address后面,默认访问ip不加端口号,选择default server虚拟主机。
  3. ssl :限制仅能够通过ssl连接提供服务。
  4. backlog= :后援队列,超过session最大上限后,新请求进入后援队列的长度,例如并发2万连接,超过了5000连接则设置=6000,就是这个意思。
  5. rcvbuf= : 接收缓冲区大小,客户端访问nginx时候,也是先放入缓冲区队列等待;
    sndbuf= : 发送缓冲区大小,nginx返回数据给客户端,也先放入缓冲区队列。

server_name []

  1. 支持通配符和正则表达式匹配:server_name ~ *.a.com,通过通配符可以判断只要域名解析成立,x.a.com的网站最后都会导向到初始www.a.com中。
  2. 不推荐匹配模式,消耗服务器资源,精确网站最好。

location [] 可以放在server {…}和location {…}

  1. 一定理解root定义在location外和location内的区别

  2. root: 这个没什么说的,网站路径,根目录确定好位置,可以放在location外,可以指向一个文件。

  3. location /…
    // location对应的部分为URL,一定要理解这句话,location /shit 的意思就是 http://<网址>/shit/ 这个路径。

  4. 理解root和location的关系:

    location /shit {        // URL:http://www.xx.com/shit/ 这个是URL拼接
       root /data/damn      // 真实路径 /data/damn/shit/<xx资源>,真实存在的东西
       }
       // 如果访问 http://<网址>/shit/<xx资源> 这个路径,
       // 取得的资源是在 /data/damn/shit/<xx资源>,这时location外部的root定义时不生效的
    
  5. location = /index.html {…} //精确匹配指向一个文件,只能访问 http://<网址>/ ,后面多一点东西都不算精确匹配, http://<网址>/xx就不对了。

  6. location优先级问题,location优先级如果有匹配项,则比外部定义的root等级高,从高到低优先级 {= ^~ / /xx},也就是不带符号优先级最低*。

    生产中一般不会弄得这么复杂,消耗CPU计算资源
    Let’s illustrate the above by an example:
    
    location = / {            //匹配优先级最高       
        [ configuration A ]
    }
    
    location / {              //如果上面不匹配才轮到这儿,优先级最低
        [ configuration B ]
    }
    
    location /documents/ {    //比 / 更精确
        [ configuration C ]
    }
    
    location ^~ /images/ {    //左匹配比右匹配优先级高
        [ configuration D ]
    }
    
    location ~* \.(gif|jpg|jpeg)$ {     //右匹配比不带任何符号的优先级高,即大于B,C
        [ configuration E ]
    }
    /*
    The “/” request will match configuration A, 
    the “/index.html” request will match configuration B, 
    the “/documents/document.html” request will match configuration C, 
    the “/images/1.gif” request will match configuration D,
    the “/documents/1.jpg” request will match configuration E.
    */
    
  7. alias /xx 和 root /xx 区别
    alias只能用于location中

    location /shit {
    	root /xx         //匹配 /xx/shit/下的资源
    	alias /xx        //匹配 /xx下的资源,alias相当于覆盖
    }
    
  8. error页面,定义如下,这样可以定义自己的404页面

    error_page 404 /404.html;
    	location /404.html {
        	root /data/a/error/;
    	}
    

    为了防止360浏览器劫持404页面,可以使用如下方案防止劫持页面:

    error_page 404 =200 /404.html;         //404依旧是404,但是对于浏览器响应头返回的是200,这样360就会认为这是个正常的页面,不会劫持了
     	location /404.html {
         	root /data/a/error/;
     	}
    
  9. try_files xx xx xx XX: 按照顺序检查,如果前面n-1都不存在,那么返回最后的XX作为最后重定向手段。

二、 其他http{…}中的配置项

  1. tcp_nodelay on|off :
    keep alive模式下的连接是否启用TCP_NODELAY选项:可以用在server和location里面
    off时延迟发送,合并多个请求后再发送; //对服务器压力小,但是扎堆发送影响客户体验
    on时不延迟发送,来一个发一个。 //对服务器有消耗,但是客户体验好,一般开启。

  2. sendfile on|off :
    默认关闭,反向代理服务器可以不用配置此项;但是访问静态资源强烈建议开始,节省了从内核复制到用户空间再发送内核socketbuf的过程。

  3. server_token on|off|build|string :
    是否在响应报文的Server首部显示Nginx版本,server和location里面都可以使用
    根据网络安全暴露nginx版本很不安全,容易让黑客找到版本对应漏洞进行攻击,所以推荐使用off,提高安全性。
    商业版中可以此项为字符串,随便写一些字符串,例如京东网站,发现server名称为 JDWS,不是Nginx。

  4. keepalive_timeout: 一般设置30秒,根据业务情况来。

  5. keepalive_requests : 再一次长连接上所允许请求的资源最大数量。

  6. keepalive_disable none|browser : 禁止哪一种浏览器长连接。

  7. send_timeout <time>: 向客户端发送响应报文的超时时长。

  8. client_body_buffer_size 128k:
    接收客户端请求报文的body部分的缓冲区大小,默认16k,超过大小时,暂存磁盘
    client_max_body_size 10M :
    接收客户端请求报文body的最大值是10M;
    client_body_temp_path 1 2 2;
    client_body_temp_path后部文件夹由哈希值构成,每个文件都有一个哈希值运算,从后面取5位,按122比例分配,形成/1/2/2路径模式存放最终body部分的文件。

发布了49 篇原创文章 · 获赞 18 · 访问量 3999

猜你喜欢

转载自blog.csdn.net/weixin_41047549/article/details/90321744