我认为这正在成为一个永恒的问题,可能需要一个好的解决方案,因为 Docker 越来越流行。
当尝试将代理反向到 Docker 容器时,我的问题出现了,该容器使用 bitnami/moodle 图像公开端口 (8080)。我已经尝试了几天互联网上所有可能的解决方案,但没有任何帮助......
更好的方法接近解决方案,但我仍然得到没有静态文件或消息告诉的页面
'reverse proxy enabled so the server cannot be accessed directly. please contact the server administrator.'
我已经尝试过 NGINX 和 Apache2,因为我不介意使用哪一个。这里是容器中 Moodle 实例的配置和
config.php
。
阿帕奇2
<VirtualHost *:80> ServerName my.domain.com ProxyRequests Off ProxyPreserveHost On ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ </VirtualHost>
NGINX
server { listen 443; server_name my.domain.com; access_log /var/log/nginx/domain.com_access.log; error_log /var/log/nginx/domain.com_error.log; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; proxy_pass_request_headers on; proxy_pass http://127.0.0.1:8080; } }
config.php(Moodle)
<?php // Moodle configuration file
unset($CFG);
global $CFG;
$CFG = new stdClass();
$CFG->dbtype = 'mariadb';
$CFG->dblibrary = 'native';
$CFG->dbhost = 'mariadb';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'root';
$CFG->dbpass = 'moodle';
$CFG->prefix = 'mdl_';
$CFG->dboptions = array (
'dbpersist' => 0,
'dbport' => 3306,
'dbsocket' => '',
'dbcollation' => 'utf8mb4_general_ci',
);
if (empty($_SERVER['HTTP_HOST'])) {
$_SERVER['HTTP_HOST'] = 'my.domain.com';
}
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
$CFG->wwwroot = 'https://' . $_SERVER['HTTP_HOST'];
} else {
$CFG->wwwroot = 'http://' . $_SERVER['HTTP_HOST'];
}
$CFG->dataroot = '/bitnami/moodledata';
$CFG->admin = 'admin';
$CFG->reverseproxy = true;
$CFG->directorypermissions = 02775;
require_once(__DIR__ . '/lib/setup.php');
// There is no php closing tag in this file,
// it is intentional because it prevents trailing whitespace problems!
有什么想法吗?我想我已经遵循了所有的提示...
您应该在 Nginx 配置中使用容器名称的 docker 容器的 IP 地址。所有容器必须位于同一个网络中。这很重要!
例如:
NGINX
location / {
proxy_pass "http://name_of_docker_container:8080";
...
}
通过命令
docker-compose ps
或docker ps
可以知道容器的名称,通过docker inspect container_name
可以知道容器的IP地址