nginx的优化 细致 面试

nginx档案:

Nginx是俄罗斯人Igor Sysoev编写的轻量级Web服务器

2011年6月1日,nginx 1.0.4发布 官网地址 http://nginx.org/

中文网站 http://www.nginx.cn/doc/

依赖:

  • gcc-c++     c语言编译环境 nginx是c语言开发的
  • pcre-devel  PCRE(Perl Compatible Regular Expressions) 是一个Perl库 包括perl 正则表达式库 nginx 的http模块需要用到 正则表达式
  • zlib zlib-devel zlib中提供了压缩和解压的方式 nginx 用zlib对http包的内容解压
  • openssl openssl-devel 强大的安全套接字层的数据库

 

作用:

__HTTP基础功能:__

  • 处理静态文件(索引文件以及自动索引)
  • 负载均衡和容错 (反向代理加速(无缓存))
  • 模块化的结构过滤 (过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理)
  • SSL 和 TLS SNI 支持; 

__IMAP/POP3 代理服务功能:__

  • 使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
  • 使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
  • 认证方法:
  • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
  • IMAP: IMAP LOGIN;
  • SMTP: AUTH LOGIN PLAIN CRAM-MD5;
  • SSL 支持;
  • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

__支持的操作系统:__

  • FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
  • Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
  • Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
  • MacOS X (10.4) PPC;

__结构与扩展:__

  • 一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;
  • kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;
  • kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;
  • sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;
  • 输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
  • 10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存。
  • 最小化的数据拷贝操作;

__其他HTTP功能:__

  • 基于IP 和名称的虚拟主机服务;
  • Memcached 的 GET 接口;
  • 支持 keep-alive 和管道连接;
  • 灵活简单的配置;
  • 重新配置和在线升级而无须中断客户的工作进程;
  • 可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
  • 4xx-5xx 错误代码重定向;
  • 基于 PCRE 的 rewrite 重写模块;
  • 基于客户端 IP 地址和 HTTP 基本认证的访问控制;
  • PUT, DELETE, 和 MKCOL 方法;
  • 支持 FLV (Flash 视频);
  • 带宽限制; 

优势:

Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡服务器。

在性能上,Nginx占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率;

在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单配置灵活。

 

 

nginx目录结构组件

nginx 树状图 详细解释

[root@ localhost ~]# tree /usr/local/nginx/
/usr/local/nginx/
├── client_body_temp
├── conf    //nginx的所有配置文件
│   ├── fastcgi.conf    //fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default //fastcgi.conf的默认备份文件
│   ├── fastcgi_params // fastcgi 的参数
│   ├── fastcgi_params.default // fastcgi 的参数的默认位置文件
│   ├── koi-utf   //编码转换映射文件
│   ├── koi-win //编码转换映射文件
│   ├── mime.types   //文件扩展名与文件类型映射表 媒体类型
│   ├── mime.types.default //mime的默认备份文件
│   ├── nginx.conf  //nginx的默认主配置文件
│   ├── nginx.conf.default //主配置文件备份
│   ├── scgi_params #scgi相关参数文件;
│   ├── scgi_params.default  #scgi相关参数文件备份;
│   ├── uwsgi_params #uwsgi相关参数文件;
│   ├── uwsgi_params.default  #uwsgi相关参数文件备份; 
│   └── win-utf   //编码转换映射文件
├── fastcgi_temp #fastcgi临时数据目录;
├── html #编译安装时nginx的默认站点目;
│   ├── 50x.html #错误页面优雅替代显示文件,例如出现502错误时会调用此页面;
│   └── index.html #默认的首页文件;
├── logs   #nginx默认的日志路径,报错错误日志及访问日志;
│   ├── access.log  #nginx默认的访问日志文件;
│   ├── error.log #nginx的错误日志文件;
│   └── nginx.pid  #nginx的pid文件,nginx进程启动后,会把所有进程的ID号写入此文件
├── sbin   #nginx的命令目录
│   └── nginx  #nginx的启动命令nginx;
├── scgi_temp  #执行对应模块时,Nginx所保留的临时性文件
└── uwsgi_temp #执行对应模块时,Nginx所保留的临时性文件

9 directories, 21 files

1.关于 fastcg i原本Nginx只有fastcgi_params,后来发现很多人在定义SCRIPT_FILENAME时使用了硬编码的方式。例如,fastcgi_param SCRIPT_FILENAME /var/www/foo$fastcgi_script_name。于是为了规范用法便引入了fastcgi.conf。
2.关于 koi-utf、koi-win、win-utf
这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码。
koi-win: charset_map  koi8-r < -- > windows-1251
koi-utf: charset_map  koi8-r < -- > utf-8
win-utf: charset_map  windows-1251 < -- > utf-8

2.2常用nginx配日志文件 nginx.conf 的详细解释

参数

user 设置使用用户
worker_processes 进行增大并发连接数的处理(最好设置跟cpu保持一致)
error_log nginx的错误日志
pid nginx服务启动时候pid

#user  nobody; //用户
worker_processes  1;  并发连接数

#error_log  logs/error.log; 错误日志
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid; pid


events {
    worker_connections  1024;
}


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

}

 

3.nginx的优化:

 

常见面试题: (部分相当于上面的理论用自己的话总结出来)

1.同作为Web服务器,nginx和Apache 你觉得哪个更好

相比 Apache 服务器,Nginx 因其采用的异步非阻塞工作模型,使其具备高并发、低资源消耗的特性,高度模块化设计使 Nginx 具备很好的扩展性;在处理静态文件、反向代理请求等方面,Nginx 表现出很大的优势。 

apache 是同步多进程模型,一个连接对应一个进程rewrite ,比nginx 的rewrite 强大 模块超多,基本想到的都可以找到 少bug ,nginx 的bug 相对较多 超稳定 

一般来说,需要性能的 web 服务,用 nginx 。如果不需要性能只求稳定,更考虑 apache ,前端 nginx 抗并发,后端 apache 集群,配合起来会更好

2.什么是异步和同步 阻塞和非阻塞

阻塞和非阻塞强调的是程序在等待调用结果(消息,返回值)时的状态.  

同步就是我强依赖你(对方),我必须等到你的回复,才能做出下一步响应。即我的操作(行程)是顺序执行的,中间少了哪一步都不可以 , 同时如果我没有收到你的回复,我就一直处于等待、也就是阻塞的状态。 异步则相反,我并不强依赖你,我对你响应的时间也不敏感,无论你返回还是不返回,我都能继续运行;你响应并返回了,我就继续做之前的事情,你没有响应,我就做其他的事情。也就是说我不存在等待对方的概念,我就是非阻塞的。

参考大神的博客 很容易懂 https://blog.csdn.net/huangqiang1363/article/details/79508852

3. Nginx的重写

rewrite的组要功能是实现RUL地址的重定向。

Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持

重写 的实现 参考大神的博客 https://www.cnblogs.com/czlun/articles/7010604.html

 

4.反向代理和正向代理

反向代理(Reverse Proxy)方式是指以代理服务器接受internet上的连接请求,然后将请求转发内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端

正向代理(Forward Proxy)通常都被简称为代理,就是在用户无法正常访问外部资源,比方说受到GFW的影响无法访问twitter的时候,我们可以通过代理的方式,让用户绕过防火墙,从而连接到目标网络或者服务。


 

 

 

 

 


出处是这里 我是从这里学习到的 https://www.jianshu.com/p/6215e5d24553

5.nginx模块处理

 

 

 

6 动静分离:

动态文件和静态文件分开处理 一般是nginx 处理静态,tomcat处理动态

有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件

减轻后端服务器压力,提高静态资源访问速度:

 

 

 

posted @ 2020-01-03 21:08  Databasess  阅读(590)  评论(0编辑  收藏  举报