Nginx的正向与反向代理

一、Nginx简介

1. 什么是Nginx

Nginx(发音为"engine-x")是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器。Nginx是由俄罗斯的Igor Sysoev(伊戈尔·赛索耶夫)为解决C10k问题(即同时处理超过10000个客户端连接)而开发的。它以高性能、稳定性、功能丰富和低资源消耗而闻名。它第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。

2. Nginx优点

1)高性能 :Nginx能够处理大量的并发连接,且内存消耗相对较低。

2)高稳定性 :Nginx以其稳定性而著称,极少出现崩溃的情况。

3)模块化 :Nginx支持模块化设计,可以根据需要加载或卸载特定的模块。

4)配置简单 :Nginx的配置文件简洁明了,易于理解和维护。

5)跨平台:Nginx可以在多种操作系统上运行,包括Linux、BSD、Mac OS和Windows。

二、正向代理

正向代理 (代理客户端),例子:VPN、游戏加速器、公司网络

正向代理通常用于客户端,在客户端配置代理服务器进行指定网站访问,由代理服务器转发请求,返回给客户端,比如国内无法访问谷歌,这个时候我们就可以设置正向代理来访问

正向代理主要作用

1)访问控制 :代理服务器可以控制客户端可以访问哪些网站或服务。

2) 缓存 :代理服务器可以缓存请求的结果,提高访问速度。

3)隐私保护 :代理服务器可以隐藏客户端的真实IP地址,提供一定程度的匿名性。

4)过滤:代理服务器可以过滤请求和响应,例如屏蔽广告或不适当的内容。

Nginx在正向代理中的配置示例:

sql 复制代码
...
server {
    resolver 8.8.8.8;#指定DNS服务器IP地址
    listen 80;#监听80端口
    server_name localhost;
    # 正向代理转发http请求
    location / {
        proxy_pass http://$http_host$request_uri;
        proxy_set_header HOST $host;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0k;
        proxy_send_timeout 30;
        proxy_read_timeout 60;
    }
}
...

注意:nginx官方并不支持直接转发https请求,nginx支持https需要ngx_http_proxy_connect_module模块

三、反向代理

反向代理 (代理服务端),例子:访问百度网址

反向代理是服务端,客户端不需要知道目标服务器的地址,反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的IP地址

反向代理的主要作用

1)负载均衡 :反向代理可以将请求通过负载均衡算法分发到多个后端服务器,平衡负载。

2)缓存 :反向代理可以缓存静态内容,减轻后端服务器的负担。

3)SSL加密 :反向代理可以管理SSL/TLS加密和证书,简化后端服务器的配置。

4)压缩 :反向代理可以对响应进行压缩,提高传输效率。

5)安全:反向代理可以作为额外的安全层,隐藏目标服务器的身份,从而保证内网安全。

Nginx在反向代理中的应用配置示例:

sql 复制代码
server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://127.0.0.1:8080;
            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_pass http://127.0.0.1:8080; 将所有请求转发到本地的8080端口。

proxy_set_header 指令用于确保后端服务器收到正确的客户端请求信息。

附:Nginx配置文件说明

nginx的配置文件结构如下:

sql 复制代码
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

通常包含以下几部分:

sql 复制代码
全局块        
├── events  
├── http    
│   ├── upstream 
│   ├── server   
│   ├── server
│   │   ├── location 
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

全局块:

全局配置,影响nginx的整体行为,例如定义运行nginx进程的用户(组)、允许打开的文件数、日志文件位置等。比如:

sql 复制代码
# 全局块
user  nginx;
# Nginx 进程的数量
worker_processes  1;

# 定义 PID 文件位置
pid        /var/run/nginx.pid;

# 定义错误日志文件位置
error_log  /var/log/nginx/error.log warn;
# 定义访问日志文件位置
access_log  /var/log/nginx/access.log  main;

events块:

配置与客户端连接的相关参数,如工作连接数、事件处理机制等。

sql 复制代码
# events 块
events {
    worker_connections  1024;
}

http块:

定义了所有http服务器的配置指令,包括文件引用、日志定义、http头部信息、MIME-TYPE定义、SSL配置、客户端请求头处理等。

sql 复制代码
# http 块
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    # 定义 sendfile
    sendfile        on;
    # 定义 keepalive 超时时间
    keepalive_timeout  65;

    # 包含其他配置文件
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    # server 块
    server {
        listen       80;
        server_name  localhost;

        # 定义 location 块
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        # 定义 error_page
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        # 定义 upstream 块
        upstream backend {
            server backend1.example.com;
            server backend2.example.com;
        }

        # 定义 map 块
        map $http_host $backend_pool {
            backend1.example.com backend1;
            backend2.example.com backend2;
            default              backend1;
        }

        # 使用 upstream
        location /backend {
            proxy_pass http://$backend_pool;
        }
    }
}

server块:

http 块可以包含多个 server 块,每个 server 块定义了一个虚拟主机。server块定义了服务器级别的配置指令,可以有多个server块,每个块定义了一个虚拟主机。server块可以继承http块的配置。server 块中的配置对特定的虚拟主机有效。server 块可以包含多个 location 块。

location块:

定义了请求的路由和处理方式,用于匹配请求的URI,并定义如何处理匹配的请求

upsteam块:

定义了一组后端服务器,用于负载均衡。upstream块中的配置对特定后端服务器有效。

map块:

可以基于某些请求设置变量的值,map块中的配置对整个nginx服务有效。

include指令:

用于包含其他配置文件。include指令可以出现在全局块、http块或server块中,用于引入其他配置文件。

相关推荐
静听山水23 分钟前
nginx主配置文件
nginx
CodingBrother13 小时前
Nginx搭建负载均衡
运维·nginx·负载均衡
静听山水15 小时前
顶级域名&子域名
nginx
CodingBrother18 小时前
Lua在Nginx中的开发实践
nginx·lua
一只努力xx的程序媛19 小时前
如何配置 Nginx:从入门到进阶
运维·nginx
冰 河1 天前
【实战】Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP
redis·nginx·程序员·lua·高可用
2401_840192271 天前
nginx常用功能,网站、反向代理、四层代理、优化方法、python动态页面解析。
运维·nginx
代码敲上天.2 天前
nginx从入门到精通
运维·nginx
这孩子叫逆2 天前
nginx负载均衡的五种算法
运维·nginx·负载均衡