1. 场景说明

反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

由于服务器的ip可能存在对某些运营商不友好的情况,一种方法就是通过类似Cloudflare这样的CDN代理,另外就是自己寻找一个对三网(移动、电信、联通)比较友好的服务器来做反向代理。

目前的拓扑如下:
网络位置拓扑图
其中20.20.20.20为源站服务器并使用nginx作为web服务器,10.10.10.10为反代服务器同样使用nginx反向代理。

2. nginx配置

2.1 源站nginx配置

源站的nginx配置主要是修改server_name以及监听端口,其中server_name域名需要删除,基本上作为后端是不需要设置域名的;监听端口,推荐使用高位端口。

server {
    listen  22000;

    # 设置最大上传
    client_max_body_size 20M;

    root /www/wwwroot/abcd.com;
    index index.html index.htm index.php;
    #charset koi8-r;
    location / {

        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }
    }
    error_page  404                 /404.html;
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php/?.* {
        set_real_ip_from 10.10.10.10;
        real_ip_header  X-Forwarded-For;
        real_ip_recursive on;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi_params;
        set $path_info "";
        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$"){
                set $real_script_name $1;
                set $path_info $2;
        }
        fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
        fastcgi_param SCRIPT_NAME $real_script_name;
        fastcgi_param PATH_INFO $path_info;
    }

#    location ~ /.well-known {
#        allow all;
    #root /usr/share/nginx/html;
#    }

    location ~ /.ht {
        deny all;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 10d;
    }

    location ~ .*\.(js|css)?$
    {
        expires 1d;
    }

    # 避免数据库被下载
    location ~ \.(db3|dat)$ {
    deny all;
    }

}

由于在服务器端需要统计真实客户的ip地址,需要在源站配置中添加

set_real_ip_from 10.10.10.10;
real_ip_header  X-Forwarded-For;
real_ip_recursive on;

2.2 反向代理服务器配置

upstream abcd {
    server 20.20.20.20:22000;
}

server {
    listen 80;
    server_name  abcd.com;

    location / {
        add_header Cache-Control no-cache;
        proxy_set_header Host $http_host;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://abcd;
    }
}

3. 反代https

源站开启https,以letsencrypt免费证书为例。

listen  22000 ssl;
ssl_certificate /etc/letsencrypt/live/abcd.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/abcd.com/privkey.pem;

代理服务器相关配置

upstream abcd {
    server 20.20.20.20:22000;
}

server {
    listen 80;

    server_name abcd.com;
    rewrite ^(.*)$  https://$host$1 permanent;
}

server {
    listen 443 ssl;
    server_name  abcd.com;

    ssl_certificate /etc/https_conf/tkmiss.com/fullchain.pem;
    ssl_certificate_key /etc/https_conf/tkmiss.com/privkey.pem;

    location / {
        ...
        proxy_pass https://abcd;
    }
}
最后修改:2020 年 01 月 15 日 09 : 51 PM