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上请求连接的客户端
![](https://img2018.cnblogs.com/i-beta/1795980/202002/1795980-20200223155652830-388865828.png)
出处是这里 我是从这里学习到的 https://www.jianshu.com/p/6215e5d24553
5.nginx模块处理
6 动静分离:
动态文件和静态文件分开处理 一般是nginx 处理静态,tomcat处理动态
有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件
减轻后端服务器压力,提高静态资源访问速度: