Nginx学习笔记
一,什么是Nginx?
Nginx是一款轻量级的Web服务器,反向代理服务器,电子邮件代理服务器
正向代理:代理的是用户,代理为客户端做事
反向代理:代理的是服务器,代理为服务器做事
二,什么是反向代理?
反向代理方式:用代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,
并将从服务器上得到的结果返回给internet上请求链接的客户端,此时代理服务器对外就表现为一个
反向代理服务器。
三,nginx启动,停止
1.启动:只需要直接运行Nginx可执行文件
cd /usr/local/nginx/sbin
sudo ./nginx
2.查看nginx进程:
ps -ef|grep nginx
3.控制:
nginx -s stop :快速关闭
nginx -s quit :优雅的关闭
nginx -s reload :重新加载配置文件
nginx -s reopen :重新打开日志文件
4.停止:
nginx -s quit :等worder进程处理完当前请求后再退出nginx,
5.重新加载配置文件:
nginx -s reload :修改配置文件后,只有重新加载指令被传给Nginx进程或重新启动nginx才会生效。
一旦主进程收到重新加载配置的信号,就会检查新配置文件的语法正确性,并尝试应用配置信息。如果
成功,主进程会启动新的worker进程并向老的worker进程发送消息,要求他们关闭。否则,主进程回滚所作的修
改,继续所用老的配置工作。老的worker进程收到关闭命令,停止接受新连接,继续处理当前请求,直到所有的
请求都处理完,然后老worker进程退出。
6.其他控制方式:
ps -ax | grep nginx :获取正在运行的nginx进程,使用ps工具
kill -s quit 1628 :根据进程Id退出
四,配置文件结构
1.nginx由模块组成,这些模块由配置文件中的指令进行控制
2.指令分为简单指令和块指令
3.
五,提供静态内容
1.web服务器的一个重要任务是对外提供文件(比如提供图片或静态html页面)
2.比如,根据请求,从不同的本地目录提供文件:/data/html(包含html文件),/data/images(包含图片)
3.在http块内部设置一个server块,后者包含两个location块。
配置文件可能包含几个server块,用监听端口号和server名称进行区分。
一旦nginx决定用哪个server处理一个请求,它会比对请求首部的URI和server内部的location指令
4.server块内部的location块:
location / { // 匹配所有以/开头的请求
root /data/www;
}
location /images/ { // 匹配所有以/images/开头的请求
root /data;
}
如果有多个location块都匹配了请求,nginx会选择前缀最长的一个。所以只有其他全部location全部不
匹配的时候才匹配第一个location
5.配置:
server { location / { root /data/www; } location /images/ { root /data; } }
这已经是一个可以工作的server配置,监听标准80端口,在本机可以访问http://localhost/进行访问
5.log日志:
一旦有什么与预期不符的事情,你可以尝试在access.log和error.log文件中查找原因,它们
在/usr/local/nginx/logs 或者/var/log/nginx目录下面。
六,配置一个简单的代理服务器
1,nginx的一个常见用途是作为代理服务器,就是接收客户端请求,然后传递给被代理的服务器并获得响应,
再返回给客户端
2,配置一个基本的代理服务器,他会用本地目录来响应所有的图片(静态资源)请求,其他请求会转发给
被代理的服务器,在这个例子中,服务器和代理服务器都用nginx服务器实现
2.1:在nginx配置文件中增加一个server块,定义一个被代理的服务器
server { listen 8080; //监听8080端口, root /data/up1; //并将所有请求映射到本地文件系统的/data/up1目录 location / { } }
2.2:创建这个目录,把index.html文件放在目录下
2.3: 注意:root指令被放在了server上下文。如果用来处理请求的location块中没有自己的root指令,就会使用
这个root指令
3.配置:
server { location / { proxy_pass http://localhost:8080; } location /images/ { root /data; } }
现在将/images/包含前缀的请求映射到/data/images目录下的文件,我们修改一下,让它匹配包含特定文件扩展
名的请求
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
这个服务器会过滤以 .gif、 .jpg、 或者 .png结尾的请求,将他们映射到/data/images目录(就是把root参数
插入到URI中)然后将所有其他请求传递给上面配置好的被代理的服务器。
七,传递请求头
1.默认情况,NGINX在代理请求时会重新定义两个HTTP头字段,“Host”和“Connection”,并删除值为空的头部
字段。“Host”会被设置为 $proxy_host变量的值,“Connection”被设置为close。
2.要改变这些设置,包括修改其他头字段,使用proxy_set_header指令。这个指令可以在location或者更高层使
用。也可以在特定的server上下文或者在http块中。
location /some/path/ { proxy_set_header Host $host; //“Host”字段被设置为$host变量 proxy_set_header X-Real-IP $remote_addr; proxy_pass http://localhost:8000; }
3.要阻止一个头字段被传递给被代理的服务器,只要把它设置为空字符串。
location /some/path/ { proxy_set_header Accept-Encoding ""; proxy_pass http://localhost:8000; }
八,配置缓冲
1.默认情况,nginx缓冲来自被代理服务器的响应。
响应被保存在内部缓冲区,直到所有的响应都接收完才发送给客户端。缓冲帮助优化了客户端的性能,如果nginx
将响应同步发送给客户端,会浪费被代理服务器的时间。然而,当启用了缓冲,nginx允许被代理服务器快速处理
响应,nginx会保存响应直到客户端下载完成
2.负责开启和关闭缓冲功能的指令是proxy_buffering。默认这个值是on也就是启用缓冲功能。
3.proxy_buffers指令控制分配给一个请求的缓冲大小和数量。从被代理服务器返回的第一部分响应被保存在单独
的缓冲区,这个缓冲区的大小用proxy_buffer_size控制。这部分通常包含一个相当小的响应头,可以比其余的响
应使用的缓冲更小。
location /some/path/ { proxy_buffers 16 4k; proxy_buffer_size 2k; proxy_pass http://localhost:8000; }
4.如果缓冲被禁用,一旦收到被代理服务器的响应就会同步发送给客户端。对于需要快速交互的客户端,希望尽
快收到服务器的响应,会需要这种行为
location /some/path/ { proxy_buffering off; proxy_pass http://localhost:8000; }
5.在特定的location禁用缓冲,将location中的proxy_buffering指令设置为off
location /some/path/ { proxy_buffering off; proxy_pass http://localhost:8000; }
九.负载均衡
1.什么是负载均衡?
当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的
服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压
力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。负载均衡使用反向代理的原理实现的
2.负载均衡的几种方式
2.1:轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
upstream backserver { server 192.168.0.14; server 192.168.0.15; }
2.2:weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver { server 192.168.0.14 weight=3; server 192.168.0.15 weight=7; }
权重越高,在被访问的概率越大,如上例,分别是30%,70%。
2.3:优化版,解决session共享问题
上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二
次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一
个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该
请求通过哈希算法,自动定位到该服务器。 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后
端服务器,可以解决session的问题。( nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来
这个ip下的某个客户端和某个后端就能建立起稳固的session)
upstream backserver { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; }
2.4: fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
2.5:url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
3.每个设备的状态设置为:
down 表示单前的server暂时不参与负载
weight 默认为1.weight越大,负载的权重就越大。
max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
fail_timeout:max_fails次失败后,暂停的时间。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
upstream myServer { server 127.0.0.1:9090 down; server 127.0.0.1:8080 weight=2; server 127.0.0.1:6060; server 127.0.0.1:7070 backup; }
4.配置实例:
#user nobody; worker_processes 4; events { # 最大并发数 worker_connections 1024; } http{ # 待选服务器列表 upstream myproject{ # ip_hash指令,将同一用户引入同一服务器。 ip_hash; server 125.219.42.4 fail_timeout=60s; server 172.31.2.183; } server{ # 监听端口 listen 80; # 根目录下 location / { # 选择哪个服务器列表 proxy_pass http://myproject; } }
}
十.nginx面试相关
1.nginx是如何处理一个请求的?
首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里
面
先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的ip地址端口,再listen)
然后再fork(一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程 )出多个子
进程出来
然后子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握
手,与nginx建立好一个连接后
此时,某一个子进程会accept成功,得到这个建立好的连接的socket,然后创建nginx对连接的封装,即
ngx_connection_t结构体
接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,nginx或客户端来主动关掉
连接,到此,一个连接就寿终正寝了
2.正向代理和反向代理