nginx > 바니시 > hhvm

nginx > 바니시 > hhvm

SSL을 해석하고 https가 아닌 모든 트래픽을 https로 리디렉션하는 프런트 엔드에 nginx가 있습니다.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://www.example.com$request_uri;
}

거기에서 다음 서버 블록은 SSL을 해석하고 varnish로 전달합니다.

server {
    listen 443 ssl spdy;
    server_name example.com www.example.com;
    ...<ssl stuff>...

    location / {
        proxy_pass http://127.0.0.1:6081;
        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 https;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

내 문제를 디버깅하는 데 도움이 되도록 광택제에서 모든 것을 꺼냈으므로 지금은 포트 8080의 nginx로 다시 전달됩니다.

backend default {
.host = "127.0.0.1";
.port = "8080";
}

nginx 포트 8080 서버 블록으로 돌아갑니다:

server {
   listen       8080;
   server_name  example.com www.example.com;
   ...<access logs root index stuff>...

   location ~ \.php$ {
       try_files $uri =404;
       include fastcgi_params;
       fastcgi_pass php;
   }
}

php 변수는 127.0.0.1:hhvmport의 hhvm에 대한 업스트림을 가리키며 폴백은 127.0.0.1:php-fpmport입니다.

WordPress 관리자에게 연결하려고 하면 리디렉션 루프가 발생합니다. 이것이 워드프레스 문제인지 서버 설정 문제인지 잘 모르겠습니다. 업스트림에서 hhvm을 제거하고 php-fmp로 직접 이동할 때 아무런 문제도 없기 때문입니다. 또한 컬 -Ihttps://www.example.com/wp-admin/302 리디렉션을 표시합니다.https://www.example.com/wp-admin/301 대신. 또한 그림에서 바니시를 완전히 제거해도 hhvm은 wp-admin에 대한 액세스를 허용합니다. 추가된 헤더(X-Forwarded 등..)가 hhvm을 혼란스럽게 하고 트래픽이 443에서 나올 것으로 예상합니까?

/var/log/hhvm/error.log에는 jit이 생성되는 것 외에는 아무것도 표시되지 않습니다. nginx에서 리디렉션 로그를 켜도 도움이 되지 않습니다. 기대하지는 않았지만 시도해 볼 가치가 있었습니다.

여기서 무슨 일이 일어나고 있는지 정말 혼란 스럽습니다. 광택제를 제거하면 문제가 해결되거나 wordpress의 관리 섹션에서 hhvm을 우회하면 설정 문제처럼 보이는 문제가 해결되기 때문에 이것이 wordpress 섹션에 속하는지 확실하지 않았습니다. 어떤 도움이라도 주시면 감사하겠습니다. 중요한 경우 Ubuntu 14.04에서 실행됩니다.

답변1

이는 모든 안전하지 않은 트래픽을 보안 URL(예: 을 통해)로 리디렉션하도록 WordPress를 구성한 경우 발생할 수 있습니다 .htaccess. 첫 번째 요청이 도착하고 SSL 헤더가 제거된 후 WordPress에 도달하면 연결이 안전하지 않음을 발견하고 결과적으로 클라이언트에 업스트림 리디렉션을 보냅니다.

WordPress가 이 작업을 수행하고 있지 않다고 생각한다면 몇 가지 일반 PHP(예: 정말 간단한 작업 <?php phpinfo(); ?>)를 사용하여 시도해 보세요. 플랫 PHP를 사용하여 디버깅하는 경우 이를 디버깅하는 가장 좋은 방법은 A 지점과 B 지점 사이의 트래픽을 스니핑하거나(예상 트래픽과 현실 사이의 단절이 나타나는 위치를 확인하기 위해) 흥미로운 지점으로 직접 이동하는 것입니다. 포트(예: http://host:port/URI 구문을 통해, "호스트" 파일 수정 및/또는 포트 전달 사용)를 통해 예상한 것과 일치하지 않는 데이터를 얻을 때까지 한 번에 서비스 하나를 스택 위로 이동합니다.

답변2

다음을 추가해야 했습니다.

fastcgi_param HTTPS on;

PHP로 전달되는 위치 블록에서 모든 것이 이제 의도한 대로 작동합니다.

관련 정보