Я установил 2 веб-сервера nginx из этого руководства https: //www.digitalocean. com / community / tutorials / how-to-set-up-nginx-load-balancing-with-ssl-termination
Проблема в том, что одна простая тестовая php-страница через SSL загружается нормально, но когда я пытаюсь установить какое-то приложение PHP, такое как Moodle, я получил предупреждение о смешанном содержимом и пользовательский интерфейс не работает ... (некоторые в режиме HTTP, некоторые в режиме HTTPS и т. д.)
Как я могу загрузить весь контент по всем HTTPS (исправить смешанное содержимое)?
Вот конфигурация внешнего интерфейса SSL Nginx:
# File: \etc\nginx\sites-available\main.big.vm
upstream mainBigVm {
server main.big.vm:80;
}
server {
listen 80;
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
server_name main.big.vm;
location / {
proxy_pass http://mainBigVm;
proxy_set_header Host $host;
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;
}
}
А вот конфигурация внутреннего интерфейса Nginx (на сервере main.big.vm):
# File: \etc\nginx\sites-available\default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html index.php;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5217-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
обновление 170430-1
Я пробовал предлагаемая конфигурация во внешнем интерфейсе, но все еще не работает.
upstream mainBigVm {
server main.big.vm:80;
}
#suggestion
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 80;
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
server_name main.big.vm;
location / {
proxy_pass http://mainBigVm;
proxy_set_header Host $host;
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;
}
}
update 170501-1
Я тоже заметил странное поведение. Если я ввожу URL-адрес HTTPS с конечной косой чертой, URL-адрес загружается, но если я ввожу без конечной косой черты, каким-то образом URL-адрес преобразуется в HTTP с автоматическим добавлением конца слэша
Наконец-то я заработал. Я нашел мои старые заметки о SSL nginx-реверсивном прокси с Apache, нуждающемся в этом конфиге на
# file \apps\httpd\2225\conf.d\nginx-reverse-proxy.conf
# Make sure mod_env is loaded.
# This make sure variable _SERVER[HTTPS] is set if using Nginx as reverse proxy for Apache
# This will help some application to work, since many apps using _SERVER[HTTPS] to work with SSL
# Make sure Nginx has config: proxy_set_header X-Forwarded-Proto $scheme;
SetEnvIf X-Forwarded-Proto https HTTPS=on
Так как я использую бэкэнд Nginx, я попробовал этот конфиг для тестирования:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5217-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param HTTPS 'on'; # I tested by adding this line to check
}
И Он работает, теперь мой Moodle хорошо загружен в HTTPS Front-End (css, js, изображения и т.д....). Теперь мне просто нужна конфигурация Nginx, похожая на Apache SetEnvIf X-Forwarded-Proto https HTTPS=on
ИЛИ убедитесь, что весь мой бэкэнд работает на SSL каждый раз
Update 170502: Я получил этот пример здесь https://stackoverflow.com/questions/4848438/fastcgi-application-behind-nginx-is-unable-to-detect-that-https-secure-connectio
В вашем интерфейсе слушайте 80, а затем немедленно перенаправить это на постоянный 443
сервер {
слушать 80;
расположение / {
return 301 https: // $ host $ request_uri;
}
}
Просканируйте исходный HTML-код страницы с предупреждением о смешанном содержимом
и посмотрите, какие ресурсы загружаются через HTTP вместо HTTPS. Если они находятся вне ресурсов, вам не повезло. Если они находятся внутри ресурсов, поскольку HTML-страница генерируется вашим кодом PHP, посмотрите, что вы можете сделать в своем программном обеспечении PHP (возможно, некоторая конфигурация?), Чтобы убедиться, что все изображения / CSS / сценарии / и т. Д. Используют https
, а не http
.