我最近正在学习 Nginx 上的代理缓存和负载平衡,并且在尝试使代理为我拥有的 moodle 安装工作时遇到了一些问题,每当我将代理放在 moodle 上时,它都会显示“重定向太多”,但它对我服务器上的其他类型的站点运行良好。
据我所知,要创建代理,我需要在 nginx 上创建一个新块,将我的域信息放在上面,然后将代理配置放在上面,例如服务器标记之前的上游和位置标记上的 proxy_pass (我没有编辑 nginx 上的默认文件,我创建了一个名为 cache.conf 的新文件,默认值没有更改):
#nano cache.conf
upstream origin_server {
server 127.0.0.1:8000;
}
server {
server_name mysite.com www.mysite.com;
location / {
include proxy_params;
proxy_pass http://origin_server;
proxy_cache custom_cache;
proxy_cache_valid any 10m;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_cache_key "$host$request_uri$cookie_user";
proxy_cache_min_uses 3;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.mysite.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = mysite.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name mysite.com www.mysite.com;
return 404; # managed by Certbot
}
然后在我的主站点上我删除了域信息,只留下一个 _ 作为服务器名称并让它监听端口 8000(就像代理块文件上的上游标记一样)这样代理就会指向主站点:
#nano mysite.conf
server {
listen 8000;
listen [::]:8000;
root /var/www/mysite.com/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ [^/]\.php(/|$) {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
}
使用此配置,任何 .html 文件都可以正常工作,它可以正常加载,但是对于 moodle 来说它根本不起作用,它总是返回“重定向过多”错误,即使在我的 moodle 上的 config.php 文件中,$CFG->wwwroot 具有与代理相同的域,而且,代理和主站点在同一台服务器上,我只是想在购买新服务器之前了解代理,以使代理指向另一台服务器并开始在两者之间进行负载平衡。
我如何让 moodle 与代理一起工作?
编辑:我忘了提到,只要我从代理中删除 SSL 配置,moodle 就会工作,如果我将配置放在 cache.conf 文件上,如下所示:
#nano cache.conf
upstream origin_server {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name mysite.com www.mysite.com;
location / {
include proxy_params;
proxy_pass http://origin_server;
proxy_cache custom_cache;
proxy_cache_valid any 10m;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_cache_key "$host$request_uri$cookie_user";
proxy_cache_min_uses 3;
}
}
Moodle 运行良好,可能是 SSL 配置问题。
答案1
转到 moodle 主目录中的 config.php 文件,验证 $CFG->wwwroot 是否有 https,然后在文件末尾添加 $CFG->sslproxy = true;。
docs.moodle.org 上有一篇文章教如何创建服务器集群,其中说,每当 ssl 来自拥有站点名称的负载均衡器(某种程度上的代理)时,moodle 需要在 config.php 上具有 $CFG->sslproxy,这样它就可以识别 ssl 证书。