Nginx 基础知识点整理(续)—— 反向代理
Posted 程序杂烩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 基础知识点整理(续)—— 反向代理相关的知识,希望对你有一定的参考价值。
上部分主要是nginx的一些基本配置相关的内容,本次是接着上一部分继续写的,关于一些Nginx高效的一些原因,及反向代理的使用。
Nginx的worker进程数量为什么要与CPU核心数量一致呢?
Nginx的一个worker进程可以同时处理的请求数只受限于内存的大小,而在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入休息睡眠状态,所以,当Nginx上的进程数与CPU核心数相等时,进程间切换的代价是最小的。每个worker进程都是单线程的进程,多worker进程可以充分利用多核系统架构,如果worker进程数多于CPU内核数,那么会增大进程间切换带来的消耗(Linux是抢占式内核)。Nginx为了更好的利用多核的特性,提供了cpu亲缘性的绑定选项,可以将某个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。
关于事件模型epoll的一些了解
epoll库是Nginx服务器支持高性能事件驱动库,属于poll库的一个变种,是在Linux2.5.44引入。它与poll/select库最大的区别在于效率。
poll和select的处理方式
1. 创建一个待处理事件列表
2. 列表发送到内核
3.返回时再轮询检查这个列表,判断事件是否发生。
epoll 的处理方式
1.epoll 库通过相关调用通知内核创建一个有N个描述符的事件列表
2. 给描述符设置所关注事件,并添加到内核事件列表
3. 通过相关能用对事件列表中的描述符进行修改与删除
这样,只需要在进程启动时建立一个epoll对象,并在需要的时候进行添加或者删除就可以了。
关于反向代理
反向代理(Reverse Proxy) 方式是指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端。
如下图
当客户端发来HTTP请求时,Nginx并不立刻转发到上游服务器,而是先把用户的请求完整地接收到Nginx所在的服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器。这种方式的缺点是延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间。而优点则不言而喻,大大降低了上游服务器的负载,尽量把压力放到Nginx的服务器上。
反向代理的基本配置
proxy_pass URL
该配置项会将当前的请求反向代理到URL参数指定的服务器上,URL可以是主机名或者IP+port形式,也可以是UNIX句柄,亦或者是直接使用upstream块。
注意 反向代理默认情况下不会转发请求中的Host头部分,如果需要转发,则必须加上 proxy_set_header Host $host.
# 主机名+端口方式
proxy_pass http://example.com:8080/path
# UNIX句柄
proxy_pass http://unix:/path/to/back.socket:/path/;
# 负载均衡方式
upstream backend {...}
proxy_pass http://backend;
proxy_method method
该配置项表示转发时的协议方法名。如果设置为POST,则客户端发过的GET请求也会转发为POST请求。
proxy_hide_header Header
该配置项会禁止某些HTTP头部字段不能被转发
proxy_pass_header Header
与proxy_hide_header刚好相反,会将原来禁止转发的header设置为转发
proxy_pass_request_body on | off
作用为确定是否向上游服务器发送HTTP包体部分
proxy_pass_request_headers on | off
确定是否转发HTTP头部
proxy_redirect [default|off|redirect|replacement]
当上游服务器返回的响应是重定向或刷新请求时,proxy_redirect 可以重设HTTP头部的location或refresh。
反向代理实例
upstream backendServer {
server 192.168.0.1:8080 weight=10;
server 192.168.0.2:8080 weight=10;
server 192.168.0.3:8080 weight=10;
...
}
server {
listen 80;
server_name www.example.com;
access_log logs/example.access.log main;
error_log logs/example.error.log;
root html;
index index.html index.htm index.php;
## send request to backendServer ##
location / {
proxy_pass http://backendServer;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
以上是关于Nginx 基础知识点整理(续)—— 反向代理的主要内容,如果未能解决你的问题,请参考以下文章