Nginx 配置

2019-03-21
1分钟阅读时长

在 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;
}
上一页 重定向
下一页 Linux 相关命令