2010-04-16 186 views
6

我打算將所有靜態內容都移動到CDN上,所以在我的服務器上我只剩下動態內容。我現在將Nginx設置爲Apache的反向代理。 Nginx直接發送的靜態請求,無需前往Apache。將Nginx作爲Apache的反向代理服務器僅用於動態內容

在這種情況下,Nginx處理了很大一部分請求,我可以清楚地看到Nginx的必要性。

現在,我將所有靜態內容移動到另一個域,是否還需要在Apache前面有nginx。因爲現在所有請求都是默認的動態請求,所有請求都轉到Apache。

Nginx和Apache僅對動態內容運行有沒有其他好處。

我的動態內容是PHP/MySQL的

編輯:

要明確:我現在有Nginx的反向代理。它提供靜態和動態內容。但我將我的靜態文件移動到CDN。那麼我還需要在我的域名上使用Nginx嗎?

+0

這與AppEngine有什麼關係? – 2010-04-16 18:17:24

+0

「動態內容」是指每個用戶的不同內容,還是僅僅通過PHP生成的內容?如果同一頁面用於多個用戶,則可以讓Nginx將其緩存幾秒鐘,這在處理重負載時會有很大幫助。 – 2010-04-16 21:50:52

+0

不,頁面總是不一樣。我猜不需要Nginx。 – 2010-04-16 22:41:05

回答

2

不,你不需要nginx了。

+0

你可以給我一些解釋,爲什麼這不再需要。它不會以任何方式幫助Apache。 – 2010-04-16 22:42:09

+2

首先,我對你的問題有點困惑。您添加nginx僅用於提供靜態內容。你不再提供靜態內容,但你想知道你是否仍然需要nginx?它現在沒有任何用處,只是增加了開銷。 – goat 2010-04-16 22:48:26

+1

我想也許它也爲動態內容提供幫助。 – 2010-04-17 09:41:14

0

nginx的前面是情況最好的解決方案,您使用Apache 1.3:

的nginx可以輕鬆地服務於成千上萬conections的,但是Apache不能

+0

你能詳細說一下你的意思嗎?因爲我只通過Apache提供動態內容。我使用Apache 2 – 2010-04-16 18:16:06

3

我所做的一個網站是:

  • 設置nginx的作爲反向代理中的Apache
  • 配置它,以便前:
    • 請求PHP頁面(即動態內容)發送給Apache
    • 對靜態文件的請求(CSS,JS,...)由nginx直接提供。

此無需設置兩個域:都是在同一個域。


基本上,我所做的就是:

  • 服務圖片來自nginx的,沒有gzip壓縮,使用緩存
  • 從服務nginx的JS/CSS(即文本文件),用gzip壓縮,與緩存
  • 服務於一些其他擴展(pdf,exeutables,...)形式nginx的,無壓縮,無緩存
  • 傳給其他請求到Apache


這裏是我的nginx的配置文件中的樣子:

server { 
    listen 80; 
    server_name MY_DOMAIN_NAME; 

    access_log /var/log/nginx/MY_DOMAIN_NAME.access.log; 

    gzip on; 
    gzip_comp_level 2; 
    gzip_proxied any; 
    gzip_types text/plain text/html text/css text/xml application/xml application/xml+rss application/xml+atom text/javascript application/x-javascript application/javascript; 

    location ~* ^.+\.(jpg|jpeg|gif|png|ico)$ { 
     root /home/www/MY_DOMAIN_NAME; 
     #access_log off; 
     gzip off; 
     expires 1d; 
    } 
    location ~* ^.+\.(css|js)$ { 
     root /home/www/MY_DOMAIN_NAME; 
     #access_log off; 
     expires 1d; 
    } 
    location ~* ^.+\.(pdf|gz|bz2|exe|rar|zip|7z)$ { 
     root /home/www/MY_DOMAIN_NAME; 
     gzip off; 
    } 


    location/{ 
     proxy_pass http://MY_DOMAIN_NAME:8080; 
     proxy_redirect  off; 

     proxy_set_header Host    \$host; 
     proxy_set_header X-Real-IP  \$remote_addr; 
     proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; 
     proxy_max_temp_file_size 0; 

     client_max_body_size  10m; 
     client_body_buffer_size 128k; 

     proxy_connect_timeout  90; 
     proxy_send_timeout   90; 
     proxy_read_timeout   90; 

     proxy_buffer_size   4k; 
     proxy_buffers    4 32k; 
     proxy_busy_buffers_size 64k; 
     proxy_temp_file_write_size 64k; 
    } 
} 


現在,爲什麼做這樣的東西?

好,nginx的應該是:

  • 需要更少的內存
  • 更快
  • 能夠處理更多的連接

所以,我認爲它可以幫助網站有點流量,以降低Apache的負載。

+0

好吧,也許我的問題不是很清楚。但這是我現在的設置。這在我的第一段中有解釋。但現在我正在將我的靜態文件移動到另一個域。這樣我使用的資源就更多了。但是我想知道的是,如果我仍然需要Nginx。 – 2010-04-16 18:13:27

2

您還可以使用nginx從Apache實例卸載SSL處理。

例如,我們有一個配置了nginx-> haproxy-> apache服務器池的堆棧。 nginx和haproxy一起生活在一個心跳羣集上,並將請求提交到後端的apache框中。我們在nginx前端安裝所有的SSL證書。

14

是的,你絕對需要在Apache之前的nginx。 Apache每個連接使用1個線程或進程。這些線程中的每一個佔用內存。如果您有幾百人訪問您的網站並且啓用了Keepalive,則這些瀏覽器中的每一個都會使apache進程或線程忙於佔用服務器上的內存。

您可以通過禁用您的apache服務器上的keepalive來解決此問題,但這會降低網站的性能,因爲瀏覽器無法重新使用連接。

因此,您可以使用nginx作爲啓用Keepalive的反向代理。它可以維持數千個連接,佔用很小的內存(大約8 megs)。因爲nginx對於你的apache服務器是本地的,所以每個請求只佔用apache子或線程幾微秒。這意味着只需少量的apache進程即可爲數千人提供服務。

此外,nginx的配置比apache靈活得多,並且通過在前端提供靈活性。

+1

從技術角度來看,這顯然是最好的答案。您不希望pre-fork Apache使用keep-alive來處理您的客戶端連接。當然,您可以禁用保持活動,那麼您的所有用戶都會抱怨您的網站速度很慢(尤其是遠離用戶)。 – diq 2012-04-15 01:09:53

+0

非常好的答案,但不要忘記nginx可以做的所有其他好東西。與這個問題非常相關的就是緩存。動態內容的緩存將會更有意義(如果可能的話)。所以是的,nginx會幫助...很多。 – 2012-09-16 13:39:51

相關問題