正向代理与反向代理
正向代理中,proxy和client同属一个LAN,对server透明。
如:由于防火墙的原因,借助VPN访问谷歌。正向代理“代理”的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过VPN访问的。
反向代理中,proxy和server同属一个LAN,对client透明。
如:外网访问百度时,其实会进行一个转发,代理到内网去,即反向代理“代理”的是服务器端,而且这一个过程对于客户端而言是透明的。
nginx
nginx 是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时长用于服务端的反向代理和负载均衡。
nginx 的 Master-Worker 模式
启动nginx后,其实就是在 80端口启动了 socket 服务进行监听,涉及了 master进程和worker进程。
Master 进程作用:读取并验证配置文件 nginx.conf;管理worker进程。
Worker 进程作用:每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求;注意Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程。
常用的文件路径
- /usr/local/etc/nginx/nginx.conf (nginx配置文件路径)
- /usr/local/var/www (nginx服务器默认的根目录)
- /usr/local/Cellar/nginx/1.17.9 (nginx的安装路径)
- /usr/local/var/log/nginx/error.log (nginx默认的日志路径)
应用
动静分离
动静分离就是 nginx 服务器将接收到的请求分为动态请求和静态请求。
静态请求直接从 nginx 服务器所设定的根目录路径去取对应的资源,动态请求转发给真实的后台去处理。
server {
listen 8080;
server_name localhost;
location / {
root html; # Nginx默认值
index index.html index.htm;
}
# 静态化配置,所有静态请求都转发给 nginx 处理,存放目录为 my-project
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /usr/local/var/www/my-project; # 静态请求所代理到的根目录
}
# 动态请求匹配到path为'node'的就转发到8002端口处理
location /node/ {
proxy_pass http://localhost:8002; # 充当服务代理
}
}
反向代理
反向代理的作用
- 保障应用服务器的安全(增加一层代理,可以屏蔽危险攻击,更方便的控制权限)
- 实现负载均衡
- 实现跨域
server {
listen 8080;
server_name localhost;
location / {
root html; # Nginx默认值
index index.html index.htm;
}
proxy_pass http://localhost:8000; # 反向代理配置,请求会被转发到8000端口
}
即nginx 请求 localhost:8080 与请求 localhost:8000 效果是一样的。
负载均衡
在服务器集群中,Nginx 可以将接收到的客户端请求“均匀地”(严格讲并不一定均匀,可以通过设置权重)分配到这个集群中所有的服务器上。这个就叫做负载均衡。
负载均衡的作用
- 分摊服务器集群压力
- 保证客户端访问的稳定性
# 负载均衡:设置domain
upstream domain {
server localhost:8000;
server localhost:8001;
}
server {
listen 8080;
server_name localhost;
location / {
# root html; # Nginx默认值
# index index.html index.htm;
proxy_pass http://domain; # 负载均衡配置,请求会被平均分配到8000和8001端口
proxy_set_header Host $host:$server_port;
}
}