雷池或nginx配置示例
由于雷池界面没有开启 Proxy Protocol 的功能, 需要手动修改配置文件。
前往雷池的 nginx 目录: ~/safeline/resources/nginx/sites-enabled/
其中每个 IF_backend_* 文件都要修改。
以下是一个文件的示例, 其他文件类似。只需在 server 中加上注释的4点即可, 其他 nginx 应用同理:
upstream backend_9 {
server 10.10.0.2:7070;
keepalive 128;
keepalive_timeout 75;
}
map $scheme $hsts_header {
https "max-age=5184000";
}
server {
# 1.这里加上proxy_protocol
listen 0.0.0.0:8443 ssl http2 proxy_protocol;
server_name xx.xx.com;
ssl_certificate /etc/nginx/certs/cert_3.crt;
ssl_certificate_key /etc/nginx/certs/cert_3.key;
# 2.排除本地ip
set_real_ip_from 192.168.0.0/24;
set_real_ip_from 10.0.0.0/24;
# 3.开启排除IP功能
real_ip_recursive on;
# 4.真实IP使用proxy_protocol协议
real_ip_header proxy_protocol;
...省略
}
问题: 雷池目前是不支持自定义 server 内容的, 每次重启配置文件都会重置, 而且添加的网站很多的话, 修改起来也比较麻烦。
解决办法: 使用脚本一键修改所有 IF_backend_* 文件。
在目录 ~/safeline/resources/nginx/sites-enabled/ 下新建脚本 modify.sh:
#!/bin/bash
# 修改文件内容在`ssl http2`后面加上` proxy_protocol`,
# 在`gateway_timeout_page;`下一行加上4行内容:
# \n```
# set_real_ip_from 192.168.0.0/16;
# set_real_ip_from 10.0.0.0/8;
# real_ip_recursive on;
# real_ip_header proxy_protocol;
# ```
find ./ -name "IF_backend_*" | while read filename; do
if grep -q "proxy_protocol" "$filename"; then
echo "文件$filename 已包含proxy_protocol,无需修改。"
else
# 解锁
chattr -i "$filename"
sed -i 's/ssl http2/ssl http2 proxy_protocol/g' "$filename"
# 有换行
sed -i '/gateway_timeout_page;/a \
set_real_ip_from 192.168.0.0/16;\
set_real_ip_from 10.0.0.0/8;\
real_ip_recursive on;\
real_ip_header proxy_protocol;' "$filename"
fi
# 为了避免雷池重启后配置文件被重置需要锁定文件
chattr +i "$filename"
done
docker exec -it safeline-tengine nginx -t
docker exec -it safeline-tengine nginx -s reload
上面说的4点配置通过脚本一键修改, 修改后使用 chattr +i 锁住文件,防止文件被修改, 在雷池上修改或者添加站点时记得解锁。
在目录 ~/safeline/resources/nginx/sites-enabled/ 下新建解锁脚本 unlock.sh:
#!/bin/bash
find ./ -name "IF_backend_*" | while read filename; do
# 解锁
chattr -i "$filename"
done
在雷池修改或添加站点之前运行 unlock.sh 脚本, 修改完后运行 modify.sh 脚本。
教程开源