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;
}
}