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://www.jianshu.com/p/6215e5d24553
5.nginx模块处理


6 动静分离:
动态文件和静态文件分开处理 一般是nginx 处理静态,tomcat处理动态
有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件
减轻后端服务器压力,提高静态资源访问速度:

浙公网安备 33010602011771号