programing

nginx try_files, proxy_pass 및 업스트림

lastmemo 2023. 3. 2. 21:57
반응형

nginx try_files, proxy_pass 및 업스트림

저는 PHP 앱용 도커라이즈드 테스트 '플랫폼'을 구축하고 있습니다. 특히 WordPress용입니다.PHParm을 사용하여 다양한 버전의 PHP를 다른 포트로 서비스하고 있습니다.앞에 nginx를 사용하면 많은 부분이 작동하게 됩니다.(https://github.com/richardtape/testit이 메인 리포트입니다).

지금 제가 직면한 큰 문제는 워드프레스의 "상당히 심각한 문제"가 작동하도록 하는 것입니다.표준 nginx 설정에서는 다음과 같은 경우가 있습니다.

location / {
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?$args;
}

다만, 호스트 머신으로부터 좋은 URL을 취득하기 위해서, 또 하나의 코드 베이스를 취득하기 위해서, 다음의 행에 따라서 사용하고 있습니다.

server {
    listen 80;
    index index.php index.html index.htm;
    server_name 52.spaces.dev;

    location / {

        proxy_pass http://phpfarm_52;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    root /var/www;
}

upstream phpfarm_52{
    server phpfarm:8052;
}

현재 상태로는 효과가 있습니다.(PHP 5.3, 5.4, 5.5, 5.6 및 7에 이와 유사한 규칙이 5개 더 있습니다.) 홈 페이지는 호스트 머신에서 다른 server_name 각각에 로딩됩니다(그리고 각각의 PHP 버전을 출력하면 다른 PHP 버전을 얻을 수 있습니다).

그러나 두 번째로 내부 URL(또는 루트 이외의 URL(http://52.spaces.dev/about/ 등)로 전환하면 404가 표시됩니다.저도 비슷한 걸 해봤는데

location / {
    try_files $uri $uri/ /index.php?$args
}

location ~ \.php$ {
    proxy_pass http://phpfarm_52;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
}

리다이렉트 루프가 발생하는 것은 몇 가지 다른 방법에 따라 301개의 리다이렉트일 뿐이며 페이지가 로드되지 않거나 다음과 같은 오류가 발생합니다.

nginx_1      | 2016/04/08 20:31:29 [error] 5#5: *4 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.99.1, server: 52.spaces.dev, request: "GET /favicon.ico HTTP/1.1", host: "52.spaces.dev", referrer: "http://52.spaces.dev/"

막혔어요.또, nginx 설정(명백한 설정)에 대해서는 아직 초보이기 때문에, 완전히 잘못되어 있거나 멍청한 것을 하고 있는 것은 아닐까 생각합니다.좋은 의견이라도 있나?

질문의 리다이렉트 루프에서 발생하는 문제는 기본적으로 모든 요청, 심지어 정적 파일도 인덱스를 통해 라우팅하려고 한다는 것입니다.php$140 블록

여기에 두 가지 해결책이 있습니다.먼저 nginx 셋업을 하나의 nginx 인스턴스로 구현할 의향이 있다면 다음 스레드를 보세요.여러 개의 이름 있는 로케이션을 가진 NGINX try_files와 이 블로그 포스트 http://linuxplayer.org/2013/06/nginx-try-files-on-multiple-named-location-or-server

필요한 것은 리소스가 업스트림에 그대로 존재하는지(즉,404가 반환되지 않는지) 먼저 테스트해야 합니다.만약 그렇다면, 당신은 그대로 봉사해야 합니다.그렇지 않으면 rewrite block을 호출하여 index.php에 파라미터로 배치하려고 합니다.따라서 다음과 같은 결과가 초래됩니다(죄송합니다만, 테스트해 볼 기회는 없습니다만, 좋은 생각이 있으면 좋겠다고 생각합니다.

location / {
    try_files $uri $uri/ @phpproxy;
}

location @phpproxy {
    proxy_pass http://phpfarm_52;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_intercept_errors on;
    recursive_error_pages on;
    error_page 404 = @rewrite_proxy;
}

location @rewrite_proxy {
    rewrite ^/(.*)$ /index.php?$1 break;
    proxy_pass http://phpfarm_52;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
}

두 번째 해결책은 (개인적으로 선호되는) 모든 업스트림에 자체 nginx를 사용하는 것입니다.그러면 다른 모든 것과 전면을 이루는 상위 nginx는 단순한 proxy_pass의 (+아마도 일부 정적 콘텐츠)로 훨씬 깨끗한 구조를 갖게 됩니다.또한 업스트림에서 오는 404를 해결할 필요가 없기 때문에 요청 왕복도 줄어듭니다.

언급URL : https://stackoverflow.com/questions/36510523/nginx-try-files-proxy-pass-and-upstream

반응형