一.什么是nginx?
Nginx是一个http服务器。是一个使用c语言开发的高性能的http服务器及反向代理服务器。Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。
二.为什么使用nginx
在传统的项目中,因为用户使用少,并发量低,所以可以直接用tomcat服务器,客户端发送请求,tomcat服务器将信息返回到客户端。当然我们也知道,当用户多,并发量高的情况下,为了解决并发,我们会用到负载均衡。多增加几个tomcat服务器,客户端请求会到空闲的服务器上。
这种情况下会出现一个问题,用户上传图片时请求到了tomcat1上,图片资源保存到了1上,当我们请求访问这张图片时,tomcat1在忙,请求到了tomcat2此时由于数据不同步,资源请求不到。
为了解决这种问题,我们可以用分布式,专门建设一个图片服务器,不管哪个服务器接收到请求,图片都上传到图片服务器中。图片服务器上需要安装一个http服务器,可以用tomcat,apache,nginx. 为什么选用nginx, 原因如下:nginx常用做静态内容服务和代理服务器(不是你FQ那个代理),直面外来请求转发给后面的应用服务(tomcat,django什么的),tomcat更多用来做做一个应用容器,让java web app跑在里面的东西,对应同级别的有jboss,jetty等东西。
三.反向代理
说反向代理之前我们先说说正向代理。比如,我们要去访问一个外部的网站,比如谷歌,我们的网络是无法访问的,我们就需要找到一个可以访问外部的代理服务器,我们将请求发给他,他将请求再发给外部的网站,再将数据回传到客户端。这个就是正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。正向代理,客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的特点:
1.访问之前无法访问的资源
2.对代理服务器可以记录客户端的上网行为,对目标服务器可以隐藏客户端的信息
反向代理就是用代理服务器来接受请求,然后将请求发送到内部网上的服务器并将从服务器上返回的结果返回给Internet上的客户端。客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。反向代理,代理的是服务端,代理服务端接收请求。
反向代理的特点:
1.通过反向代理保障内网的安全
2.负载均衡,优化网站的负载
四.nginx与apache的区别
- 轻量级,同样起 web 服务,Nginx 比 Apache 占用更少的内存及资源。
- 抗并发,Nginx 处理请求是异步非阻塞的,而 Apache 则是阻塞型的,在高并发下 Nginx 能保持低资源低消耗高性能。
- 最核心的区别在于 Apache 是同步多进程模型,一个连接对应一个进程;Nginx 是异步的,多个连接(万级别)可以对应一个进程。
- Nginx 高度模块化的设计,编写模块相对简单。
五.nginx如何处理http请求
nginx启动会加载配置文件,得到ip与port,然后在Master里初始化这个监控的socket,可以fork出多个子进程来(一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子进程 )。之后,子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与nginx进行三次握手,与 nginx 建立好一个连接后。此时,某一个子进程会 accept 成功,得到这个建立好的连接的 Socket ,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体。添加读写事件与客户端进行数据交换,最后由一方关掉连接,自此,一个连接就寿终正寝了。
六.nginx如何实现高并发
一般来说,来了4个请求就会有4个进程去处理,直至会话关闭,如果第5个请求进来了,由于其他4个请求还处于繁忙状态,无法及时处理,因此一般会有一个调度进程,每当进来一个请求,就开个进程去处理。而在nginx中,每个请求都会由一个worker去处理,它不会全程处理,会处理到可能发生阻塞的地方(比如等待请求返回),此时worker会注册一个事件"返回了通知我,我再来处理你",于是他就去处理其他请求了,当前一个请求返回了,触发了这个事件,worker就会接手。这就是为什么说,Nginx 基于事件模型。
七.为什么nginx不用多线程
采用单线程来异步非阻塞处理请求(管理员可以配置 Nginx 主进程的工作进程的数量)(epoll),不会为每个请求分配 cpu 和内存资源,节省了大量资源,同时也减少了大量的 CPU 的上下文切换。所以才使得 Nginx 支持更高的并发。
八.为什么要动静分离
在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do 等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js 等等文件),这些不需要经过后台处理的文件称为静态文件,否则动态文件。
因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗?当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决动、静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到 Nginx 中,动态资源转发到 Tomcat 服务器中去。
九.负载均衡
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则。
所以,将服务器接收到的请求按照规则分发的过程,称为负载均衡。
Nginx 默认提供了 3 种负载均衡策略:
1、轮询(默认)round_robin
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、IP 哈希 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享的问题。
当然,实际场景下,一般不考虑使用 ip_hash 解决 session 共享。
3、最少连接 least_conn
下一个请求将被分派到活动连接数量最少的服务器
通过 Nginx 插件,我们还可以引入 fair、url_hash 等负载均衡策略。
十.session共享问题
1.客户端使用cookie
2.将session储存到数据库中
3.使用redis或memcache缓存机制来存放session
4.ip_hash策略
请解释ngx_http_upstream_module的作用是什么?
ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组。
请解释什么是C10K问题?
C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。
解释Nginx是否支持将请求压缩到上游?
您可以使用Nginx模块gunzip将请求压缩到上游。gunzip模块是一个过滤器,它可以对不支持“gzip”编码方法的客户机或服务器使用“内容编码:gzip”来解压缩响应。
解释如何在Nginx中获得当前的时间?
要获得Nginx的当前时间,必须使用SSI模块、$date_gmt和$date_local的变量。
Proxy_set_header THE-TIME $date_gmt;
用Nginx服务器解释-s的目的是什么?
用于运行Nginx -s参数的可执行文件。
解释如何在Nginx服务器上添加模块?
在编译过程中,必须选择Nginx模块,因为Nginx不支持模块的运行时间选择。
nginx状态码
499:服务端处理时间过长,客户端主动关闭了连接。
502错误可能原因
(1).FastCGI进程是否已经启动
(2).FastCGI worker进程数是否不够
(3).FastCGI执行时间过长
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
(4).FastCGI Buffer不够
nginx和apache一样,有前端缓冲限制,可以调整缓冲参数
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
(5). Proxy Buffer不够
如果你用了Proxying,调整
proxy_buffer_size 16k;
proxy_buffers 4 16k;
(6).php脚本执行时间过长
将php-fpm.conf的0s的0s改成一个时间
nignx配置
worker_processes 8; 工作进程个数
worker_connections 65535; 每个工作进程能并发处理(发起)的最大连接数(包含所有连接数)
error_log /data/logs/nginx/error.log; 错误日志打印地址
access_log /data/logs/nginx/access.log 进入日志打印地址
log_format main 'remote_addr"request" ''status upstream_addr "$request_time"'; 进入日志格式
fastcgi_connect_timeout=300; #连接到后端fastcgi超时时间
fastcgi_send_timeout=300; #向fastcgi请求超时时间(这个指定值已经完成两次握手后向fastcgi传送请求的超时时间)
fastcgi_rend_timeout=300; #接收fastcgi应答超时时间,同理也是2次握手后
fastcgi_buffer_size=64k; #读取fastcgi应答第一部分需要多大缓冲区,该值表示使用1个64kb的缓冲区读取应答第一部分(应答头),可以设置为fastcgi_buffers选项缓冲区大小
fastcgi_buffers 4 64k;#指定本地需要多少和多大的缓冲区来缓冲fastcgi应答请求,假设一个php或java脚本所产生页面大小为256kb,那么会为其分配4个64kb的缓冲来缓存
fastcgi_cache TEST;#开启fastcgi缓存并为其指定为TEST名称,降低cpu负载,防止502错误发生
listen 80; 监听端口
server_name rrc.test.jiedaibao.com; 允许域名
root /data/release/rrc/web; 项目根目录
index index.php index.html index.htm; 访问根文件