在 Gentoo, openRC 环境下。
自动图片水印
安装水印版 image_filter,
在 server{ ... } 中加入下面内容
location ~* \.(?:png|jpg|jpeg)$ {
image_filter watermark;
image_filter_watermark /home/watermark.png; # 水印图片路径
image_filter_watermark_position bottom-left; # 水印位置
image_filter_jpeg_quality 95;
image_filter_buffer 20M;
image_filter_watermark_width_from 100; # 对指定宽度以上的图片才加水印
image_filter_watermark_height_from 100;
}
将 tcp/443 端口同时分配给 ssh 和 https
需要增加 Nginx 模块
www-servers/nginx NGINX_MODULES_STREAM: map ssl_preread upstream_zone需要将原 443 端口改成其他端口,例如
listen 127.0.0.1:10443 ssl http2;
在最外层(与 http { ... } 同级)添加下面代码
stream {
map $ssl_preread_protocol $upstream {
"" 127.0.0.1:22; # ssh
# "TLSv1.2" 127.0.0.1:10043; # web
default 127.0.0.1:10443; # web
}
server {
listen 443;
listen [::]:443;
proxy_pass $upstream;
ssl_preread on;
}
}
proxy_protocol
通过 stream 转发后在 access_log 中的所有访问 IP 都变
成 127.0.0.1 ,因此需要将真实访问的客户端地址通过 proxy_protocol 获得。
需要增加 realip 模块
www-servers/nginx NGINX_MODULES_HTTP: realip
www-servers/nginx NGINX_MODULES_STREAM: realip在配置中添加下面内容:
http {
....
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
server {
listen 80 .... proxy_protocol;
listen 443 ssl .... proxy_protocol
}
}
stream {
....
server {
....
proxy_protocol on;
}
}
这样在 log_format 中使用 $proxy_protocol_addr 就可以得到真实的客户端 IP 地址了。
log_format main
'$proxy_protocol_addr - [$time_local] '
....
access_log /var/log/nginx/access_log main;
ssh
由于在 stream/server 下增加了 proxy_protocol on ,因此此时再使
用 ssh 会出现类似
Bad packet length 1349676916. Disconnecting: Packet corrupt
的错误,此时需要增加一个 server 接受 proxy_protocol
stream {
....
map $ssl_preread_protocol $upstream {
"" 127.0.0.1:10022;
# 通过 10022 端口接收 proxy_protocol 后再传给 22 端口
....
}
server {
listen 127.0.0.1:10022 proxy_protocol;
proxy_pass 127.0.0.1:22;
ssl_preread on;
}
....
}
Django 使用子路径
Django 的 PATH 为根目录,但是在 nginx 下有路径前缀,需要使用 redirect 配置
location /prefix {
# 前端配置
alias /path/to/dist;
}
location ~ ^/prefix/api {
rewrite /prefix/(.*)$ /$1 break;
proxy_pass http://ip:port;
}