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