2016-04-08 20 views
2

PHP uygulamaları için özel olarak (şimdilik) WordPress için bir 'test' platformu yapıyorum. PHP'nin farklı sürümlerinde farklı bağlantı noktalarına hizmet vermek için PHPFarm kullanıyorum. Nginx'i ön tarafta kullanarak çalışıyorum. (https://github.com/richardtape/testit ana repo'dur)nginx try_files, proxy_pass ve upstream

Şu anda karşı karşıya kaldığım büyük sorun, WordPress'in "güzel permalinks" ini çalışmaktır. Standart bir nginx kurulumunda, bu

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

gibi bir şey sadece bir vaka Ama sırayla ana makineden güzel URL'ler sahip olabilmek için, ve bir kod tabanı olması için, ben boyunca bir şey kullanıyorum Aşağıdaki satırlar:

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; 
} 

Bu, olduğu gibi çalışır. (PHP 5.3, 5.4, 5.5, 5.6 ve 7 için buna benzer 5 tane daha kural vardır.) Ana sayfa, ana makineden farklı sunucu_adılarının her birine yüklenir (ve PHP versiyonunu her birinden çıkarırsanız, farklı bir PHP sürümü aldığınızı göreceksiniz).

Ancak, ben bir 'iç' url (veya http://52.spaces.dev/about/ yani olmayan kök) geçmek ikinci, ben yönlendirme döngüsü olsun

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; 
} 

benzer bir 404. denedim şey olsun , hangisi sadece 301 yönlendirmeleri bir dizi ve sayfa asla yükler veya takıldım böyle

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/" 

olarak bir hata oldu denedim birkaç farklı şekilde bağlı. Nginx konfigürasyonunda da oldukça yeni (açık olabilir) bu yüzden tamamen yanlış ve/veya aptalca bir şeyler yapıyorum. Baska öneri?

+0

Örneğin içinden phpfarm: 8052/yaklaşık curl yaptığınızda ne olur? (Temel olarak, ilk proxy_pass'ınız böyle yapar). Ayrıca 404 alırsanız, bunun yerine hangi yönde beklersiniz? – taleodor

+0

Kendisi bir 404 olmalı, ancak anlayabildiğim kadarıyla, 'try_files $ uri $ uri//index.php? $ Args', sonunda index.php'ye (uygun satırlarla) geri dönmesi gerektiği anlamına gelir. 404 (ana sayfanın çalıştığı gerçeğiyle gösterildiği gibi). 'Güzel' permalinklerini devre dışı bırakırsam (ör.her şey index.php ile çalışır) beklendiği gibi çalışır. – RichardTape

cevap

4

Sorunuzdaki yeniden yönlendirme döngüsünde yaşadığınız sorun temel olarak, statik dosyalar için bile her isteğin index.php? $ Args bloğunuz üzerinden yönlendirilmeye çalışılmasıdır.

Burada 2 olası çözüm görüyorum. kaynak mevcutsa İlk testte gereken NGINX try_files with multiple named locations ve olması gereken ne http://linuxplayer.org/2013/06/nginx-try-files-on-multiple-named-location-or-server

, bu blog yayınında: Tek nginx örneği ile nginx kurulumu uygulamak için istekli olup olmadığını Birincisi, bu başlığa bakın yukarı yönde olduğu gibi (yani, 404 geri dönmez). Eğer yaparsa, olduğu gibi hizmet edersiniz. Eğer değilse, o zaman index.php'ye bir parametre olarak koymaya çalışan yeniden yazma bloğunu çağırırsınız. (Ben şahsen tercih edeceğini)

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; 
} 

ikinci çözüm: Yani böyle bir şey ile sona ereceğini (üzgünüm, gerçekten bu test etmek için bir şansı yok, ama umarım bir fikir verir) kendi nginx ile her upstream ön. Daha sonra, diğerlerinin ön tarafındaki en üstteki nginx, basit proxy_pass'larla (+ belki de bazı statik içerikler) daha temiz bir yapıya sahip olacak ve işte bu. Ayrıca, 404'lerin yukarı çıkışlardan gelmesi gerekmeyeceği için, talep gidiş gelişini de kısaltacaktır.

+0

İlk olarak, Pavel, zaman ayırdığınız için çok teşekkürler. İkincisi, aslında söylediklerimi anlıyorum (bu bir değişiklik yapar haha). Yukarıda sahip olduğunuz şeyi denedim (bir satır 2'de kayıp var) ama şimdi sunulan herhangi bir sayfa (giriş sayfası dahil), onu yürütmek yerine index.php dosyasını indiriyor. Sanırım bununla neredeyse oradayız. – RichardTape

+0

Noktalı virgülü düzeltilmiş;) Dosyayı indirirse, içerik türünün düzgün bir şekilde geçmediği anlamına gelir, ya da yeniden yazım çizgisiyle bir şeyler karıştırdım (bu günlerde wordpress için nasıl olması gerektiğinden emin değilim) , ya da her ikisi de. Ama onlarla oynamak onu çözmeli. Umarım yardımcı olur. – taleodor

+0

Yine, yardımlarınız için şimdiye kadar çok teşekkürler. Uygulama/octet-stream olmak için "default_type" (ve "proxy_set_header content-type") eklemeyi denedim ama hiçbir zar yok. I * düşünün, çünkü nginx'in yüklü olduğu kapsayıcı, PHP değil, bu yüzden root konumu bloğu için try_files satırında index.php dosyası görüyor ve sadece indiriliyor. Bu bir fark yaratacak mıydı? Bir .php konum bloğu eklemeyi denedim, ancak yönlendirme döngüleri almaya devam etti. Conf dosyasının şu hali şudur: https://gist.github.com/richardtape/9a84e5de6f09d14a1ff8b92449ba96b0 – RichardTape

İlgili konular