为Calibre-Web设置Nginx反向代理

首先需要了解nginx的常用命令:

#检查版本和已经启用的模块
nginx -V
#检查配置文件语法
nginx -t
#重载服务器
nginx -s reload

nginx没有用于配置sites-availablesites-enabled软连接的脚本,需要自行配置。

ln -s /etc/nginx/sites-available/* /etc/nginx/sites-enabled/*

配置样本来自Calibre-Web设置反向代理↗SSL 证书 Nginx 服务器 SSL 证书安装部署↗

首先是SSL部署样例:

server {
     #SSL 默认访问端口号为 443
     listen 443 ssl; 
     #请填写绑定证书的域名
     server_name cloud.tencent.com; 
     #请填写证书文件的相对路径或绝对路径
     ssl_certificate cloud.tencent.com_bundle.crt; 
     #请填写私钥文件的相对路径或绝对路径
     ssl_certificate_key cloud.tencent.com.key; 
     ssl_session_timeout 5m;
     #请按照以下协议配置
     ssl_protocols TLSv1.2 TLSv1.3; 
     #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
     ssl_prefer_server_ciphers on;
     location / {
         #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
         #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
         root html; 
         index  index.html index.htm;
     }
 }

其次是反向代理样例:

server {
            listen 80;
            server_name  subdomain.example.com;
            client_max_body_size 20M;

            location / { # Reduced to "/"
                proxy_bind              $server_addr;
                proxy_pass              http://127.0.0.1:8083;
                proxy_set_header        Host            $http_host;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Scheme        $scheme;
        }
    }

最后是实际使用的配置:

server {
            listen 443 ssl;
            server_name subdomain.example.com;

            ssl_certificate /path/to/crt;
            ssl_certificate_key /path/to/key;
            ssl_session_timeout 5m;
            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
            ssl_prefer_server_ciphers on;

            client_max_body_size 20M;

            location / { # Reduced to "/"
                proxy_bind              $server_addr;
                proxy_pass              http://127.0.0.1:8083;
                proxy_set_header        Host            $http_host;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Scheme        $scheme;
        }
    }

相比之下nginx的配置更为简单,交给用户处理的部分更多,在Apache2中,诸如proxy_set_header部分是交给ProxyPassReverse处理,其中proxy_set_header HostProxyPreserveHost on处理。

配置完成后按照开头命令依次测试启用重载。

最后附上Calibre-web-Wiki给出的Apache2配置:

Listen 443

<VirtualHost *:443>
    SSLEngine on
    SSLProxyEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile "C:\Apache24\conf\ssl\test.crt"
    SSLCertificateKeyFile "C:\Apache24\conf\ssl\test.key"

    <Location /calibre-web >
        RequestHeader set X-SCRIPT-NAME /calibre-web
        RequestHeader set X-SCHEME https
        ProxyPass http://localhost:8083/
        ProxyPassReverse http://localhost:8083/
        ProxyPassReverseCookiePath  /  /calibre-web/
    </Location>
</VirtualHost>

注意,需要启用headersproxyproxy_httprewrite模块,对于Apache2有:

sudo a2enmod headers proxy proxy_http rewrite