Apache-2.2

Nginx、代理傳遞給 Apache 和 SSL

  • December 8, 2012

我用 Nginx 代理設置了 Nginx 和 Apache,將除靜態資源之外的所有內容都傳遞給 Apache。我為埠 80 設置了一個伺服器,如下所示:

server {
   listen 80;
   server_name *.example1.com *.example2.com;

   [...]

   location ~* \.(?:ico|css|js|gif|jpe?g|png|pdf|te?xt)$ {
       access_log off;
       expires max;
       add_header Pragma public;
       add_header Cache-Control "public, must-revalidate, proxy-revalidate";
       add_header Vary: Accept-Encoding;
   }

   location / {
       proxy_pass      http://127.0.0.1:8080;
       include /etc/nginx/conf.d/proxy.conf;
   }
}

而且由於我們有多個 ssl 站點(具有不同的 ssl 證書),因此我server{}對每個站點都有一個塊,如下所示:

server {
   listen 443 ssl;
   server_name *.example1.com;

   [...]

   location ~* \.(?:ico|css|js|gif|jpe?g|png|pdf|te?xt)$ {
       access_log off;
       expires max;
       add_header Pragma public;
       add_header Cache-Control "public, must-revalidate, proxy-revalidate";
       add_header Vary: Accept-Encoding;
   }

   location / {
       proxy_pass      https://127.0.0.1:8443;
       include /etc/nginx/conf.d/proxy.conf;
       proxy_set_header X-Forwarded-Port 443;
       proxy_set_header X-Forwarded-Proto https;
   }
}

server {
   listen 443 ssl;
   server_name *.example2.com;

   [...]

   location ~* \.(?:ico|css|js|gif|jpe?g|png|pdf|te?xt)$ {
       access_log off;
       expires max;
       add_header Pragma public;
       add_header Cache-Control "public, must-revalidate, proxy-revalidate";
       add_header Vary: Accept-Encoding;
   }

   location / {
       proxy_pass      https://127.0.0.1:8445;
       include /etc/nginx/conf.d/proxy.conf;
       proxy_set_header X-Forwarded-Port 443;
       proxy_set_header X-Forwarded-Proto https;
   }
}

首先,我認為這裡有一個非常明顯的問題,那就是我對所有內容都進行了雙重加密,首先是在 nginx 級別,然後是 Apache。更糟糕的是,我剛開始使用 Amazon 的 Elastic Load Balancer,所以我將證書添加到 ELB,現在 SSL 加密發生了 3 次。這對性能來說一定很糟糕。

處理這個問題的明智方法是什麼?我應該在 ELB 上轉發 https -> nginx 上的 http -> apache 上的 http 嗎?

其次,上面有很多重複。最好的方法是不要重複自己將所有靜態資產處理放在一個包含文件中並將其包含在伺服器中?

第 1 部分:傳遞加密流量

讓您的第一台伺服器從客戶端連接“終止”SSL 很好。您應該有一個設置,由您控制的機器可以以受信任的方式(例如在專用網路上)交換流量,而不必一次又一次地執行 SSL。SSL 實際上僅用於傳輸安全性。瀏覽器 -> 第一個網路伺服器是不受信任的傳輸。Webserver -> 內部服務應該是可信的,因為您還將與例如文件伺服器、數據庫伺服器,甚至可能與 memcache、redis 等其他服務進行通信。

第 2 部分:nginx 配置複製

nginx 的 include 語句允許一種非常自由的重用形式,我可以看到您已經開始使用它 - 繼續並重構該配置,直到它看起來“正確”。此外,nginx 的變數擴展對於製作可重用的包含而不會留下混亂非常有用。

引用自:https://serverfault.com/questions/456394