Bir Apache http sitesini Nginx ters proxy aracılığıyla güvenli https sitesine dönüştürme

Oct 12 2020

Apache web sunucusunda çalışan eski bir WordPress sitesini desteklemeliyim. İşleri daha güvenli hale getirmek için, bu Apache sunucusu bir Docker kapsayıcısı içindedir ve Nginx ters proxy yapılandırması aracılığıyla tüm dünyaya erişilebilir. Bu site şu anda http üzerinden sunuluyor ve onu https'ye taşımak istiyorum.

Sanırım iki seçeneğim var:

  1. SSL sertifikası Nginx sitesi için yüklenir ve proxy_passApache kapsayıcısındaki düz http sitesinde yapılır:

    server {
        listen      443 ssl;
        server_name www.example.com;
    
        ssl_certificate /etc/nginx/ssl/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/letsencrypt/live/www.example.com/privkey.pem;
    
        access_log  /var/log/nginx/example.com.access.log;
    
        location /  {
            proxy_pass       http://Apache2-PHP5.6:80;
            proxy_set_header Host            $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
    }
    

    Apache sunucusu açısından bu senaryoda, siteye hala http üzerinden hizmet vermektedir.

  2. Bu daha zahmetlidir: SSL sertifikası hem ağ geçidi Nginx sunucusuna hem de proxy'li Apache sitesine yüklenir. Sonra değiştirmek gerekli olacaktır httpiçin httpsde proxy_passyapılandırma değeri.

1. senaryoda her şeyin yolunda gitmesini dilerdim. Ancak Apache'nin http üzerinden bir şeyler sunduğunu düşünmesi bazı sorunları ortaya çıkarır: yeniden yapılandırmak / hata ayıklamak istemediğim bazı gizli URL yönlendirmeleri vardır. Ve bu URL yönlendirmeleri şuna benzer bir şey yapar: İstenilen URL ise http://www.example.com, olarak yeniden yazılır (http durumu 301) http://www.example.com/main. Bu yeniden yönlendirme tarayıcı tarafından alınır ve bu nedenle, ilk istek https üzerinden yapılmış olsa da, artık yeniden yönlendirilen URL http birdir. Ayrıca html siteleri, protokol referansını da içeren kendi kaynaklarına (JavaScript ve CSS dosyaları) giden sunucu tam yol href'leri içerir. Bu noktada, bu href'lerin protokolü talebin nasıl yapıldığından mı benimsediği yoksa kodlanmış mı olduğu net değildir. Her neyse, maalesef bu ciddi bir araştırma yapmadan çalışmaz.

Bu yüzden, seçenek 2 ile kaldım. Denedim, çalışıyor, aynı SSL sertifikasını hem Nginx hem de konteynerize Apache üzerinde kurabilirim. Ama gerçekten böyle mi bırakılması gerektiğini bilmek isterim. Çünkü Apache sunucusu artık içeriğin https üzerinden sunulduğunu bilse de, artık her istek için çift SSL oluşuyor. Doğru hissettirmiyor.

Yanıtlar

3 hardillb Oct 12 2020 at 20:48

Apache'ye, gelen isteğin proxy_set_header X-Forwarded-Proto "https";ilk kurulumdaki bildirim ile bir HTTPS isteğinden proxy yapıldığını söyleyebilmelisiniz.

3 Mark Oct 12 2020 at 23:16

Nginx yapılandırmanızda HTTP_X_FORWARDED_PROTO ayarını yaparak 1. seçeneğinizdeki sorunu çözebilirsiniz (ki bu daha iyi bir yaklaşımdır)

proxy_set_header X-Forwarded-Proto $scheme;

ve WordPress'i bu satırı wp-config.php'ye ekleyerek tanıyacak şekilde yapılandırmak

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on';
}

Bu çözümün bir çeşidi için Wordpress destek makalesine de bakın .

1 HermanB Oct 12 2020 at 22:57

Normalde, tüm ağır işleri ters proxy üzerinde yapmayı ve arka uç sitesini olabildiğince orijinal tutmayı tercih ederim.

Sorununuz, özünde (WordPress) arka ucunun, ziyaretçilerinizin kullanmasını istediğinizden farklı (mutlak) URI'ler oluşturması ve kullanması gibi görünüyor.

Sen tarafından Buna çare bulabilirim (HTML) içeriği yeniden WordPress ile nginx içinde oluşturduğu ngx_http_sub_module . Bu, mutlak URL'leri aşağıdakilere benzer bir şeyle yeniden yazmanıza da olanak tanır:

    location / {    
         sub_filter 'http://example.com/' 'https://www.example.com/' ;
         sub_filter 'http://www.example.com/' 'https://www.example.com/' ;
         sub_filter_once off;
         proxy_pass       http://Apache2-PHP5.6:80;
         proxy_set_header Host            $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                
    }