2012-03-22 52 views
272

我想要使用節點,因爲它很快速,使用我在客戶端使用的相同語言,並且根據定義它是非阻塞的。但是我僱用的人編寫文件處理程序(保存,編輯,重命名,下載,上傳文​​件等),他想使用apache。所以,我必須:Apache和Node.js在同一臺服務器上

  1. 說服他使用節點(他對放棄點點地)

  2. 圖如何上傳,下載,重命名,保存在節點或

    等文件
  3. 我必須在同一臺服務器上安裝apache和節點。

哪一個是最有利的情況,我該如何實現呢?

回答

582

偉大的問題!

有許多網站和免費的網絡應用程序在PHP上運行在Apache上,許多人使用它,所以你可以混搭一些非常容易的事情,而且,它是一個簡單的服務靜態內容的方式。節點是快速,強大,優雅,並與V8的原始力量和平坦的堆棧沒有內置的依賴性的性感工具。

我也希望Apache的易用性/靈活性,但Node.JS的咕嚕聲和優雅,爲什麼我不能同時擁有

幸運的是,在Apache httpd.conf中的ProxyPass指令中,將特定URL上的所有請求管理到Node.JS應用程序並不困難。

ProxyPass /node http://localhost:8000 

此外,確保以下行沒有被註釋掉,所以你得到正確的代理服務器和子模塊重新路由的HTTP請求:

LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_http_module modules/mod_proxy_http.so 

然後在端口8000上運行的應用程序的節點!

var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello Apache!\n'); 
}).listen(8000, '127.0.0.1'); 

然後你可以訪問所有的節點。使用您的URL /node/路徑JS邏輯,網站的其他部分可以留給Apache來承載您現有的PHP頁面:

enter image description here

現在唯一剩下的就是說服你的託管公司,讓你的奔跑與這個配置!

+31

終於,它是如何完成的具體例子! – RHT 2013-09-04 15:54:22

+4

這是一個很好的答案,只是想添加一個鏈接,並提供更多有關我用於完成此項工作的代理通行證的信息。檢查評論以及.http://boriskuzmanovic.wordpress.com/2006/10/20/apaches-proxypass-on-ubuntu/ – 2013-10-15 22:08:56

+4

+1,我真的希望這是被接受的答案。 – RHH 2014-02-09 02:06:38

-23

您可以同時安裝在同一臺服務器上,但需要將它們配置爲使用不同的端口。兩者都不能使用端口80,至少不是那麼容易。

請記住,Apache是​​一個服務器,nodeJS是一種語言。

你在這裏問過這個問題之前試過用google搜索過這個問題嗎?

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/

What do I need to run a node.js script on my server?

http://www.readwriteweb.com/hack/2010/12/how-to-run-apache-and-nodejs.php

http://eastmond.org/blog/?p=45

+0

我做了,但是從我的研究看來,它看起來像我會需要使用apache來使用node.js,並且我想以其他方式使用,所以我在這裏發佈了我的問題 – Matt 2012-03-22 22:44:54

+0

你們兩個聽兩個不同的端口可以嗎? – Straseus 2012-03-22 22:46:46

+0

只要用戶不必明確鍵入端口以訪問某個頁面,那麼是的 – Matt 2012-03-22 22:47:22

-2

我假設你是一個web應用程序,因爲你指的Apache和節點。快速回答 - 有沒有可能 - 是的。是否建議 - 否。節點捆綁它自己的網絡服務器,大多數網站運行在端口80上。我還假設目前沒有受到Nodejs支持的Apache插件,我不確定創建虛擬主機是否是實現此目的的最佳方式。這些問題應該由維護Nodejs的開發人員回答,比如Joyent的好人。

而不是端口,最好是評估節點的技術堆棧,這是完全不同於大多數其他人,這就是爲什麼我喜歡它,但它也涉及到一些妥協,你應該提前知道。

您的示例看起來類似於CMS或共享網絡應用程序,並且有數百個現成的應用程序可用,它們將在Apache上正常運行。即使您不喜歡任何現成的解決方案,您也可以使用PHP/Java/Python編寫Web應用程序,或者將它與幾個現成的應用程序相匹配,並且它們都是在一個Apache實例後面設計和支持的。

現在該停下來思考我剛纔所說的話了。

現在您已準備好決定要使用哪個Techstack。如果你的網站永遠不會使用成千上萬需要Apache的現成應用程序中的任何一個,那麼去Node,否則你必須首先消除我之前說過的假設。

最後,您選擇的技術層比任何單個組件都重要。

我完全同意@Straseus使用node.js文件系統api來處理上傳和下載相對簡單,但從長遠角度考慮更多關於從網站上獲得的內容,然後選擇您的技術堆棧。

學習Node的框架比學習其他框架容易,但它不是萬能的。稍加努力(本身可能是一項值得努力的工作),您也可以學習任何其他框架。我們都相互學習,如果你作爲一個小團隊工作,比起獨自工作,你的後端技術能力也將得到更快發展,你會更有成效。因此,不要如此便宜地打折團隊其他成員的技能。

這篇文章是大約一歲,很可能你已經決定,但我希望我的咆哮會幫助下一個正在經歷類似決定的人。

感謝您的閱讀。

13

在一臺服務器上運行節點和Apache是​​微不足道的,因爲它們不會發生衝突。 NodeJS只是執行JavaScript服務器端的一種方式。真正的困境來自於從外部訪問Node和Apache。當我看到它,你有兩個選擇:

  1. 設置Apache代理所有符合要求的NodeJS,這將做文件上傳和任何其他的節點。

  2. 在不同IP:端口組合上有Apache和Node(如果您的服務器有兩個IP,那麼可以綁定到您的節點偵聽器,另一個綁定到Apache)。

我也開始懷疑這可能不是你實際尋找的。如果您的最終目標是讓您在Nodejs中編寫應用程序邏輯,並將一些「文件處理」部分轉交給承包商,那麼它的確是一種語言選擇,而不是Web服務器。

+5

另外,我剛剛意識到這是一個古老的問題。*嘆息* – 2013-04-21 00:17:49

-1

我正在尋找相同的信息。終於找到從對答案的鏈接答案通過以上@Straseus

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/

下面是最終的解決方案,以在80端口運行Apache的網站,節點JS 8080端口的服務和使用的.htaccess重寫規則

在Apache網站的DocumentRoot,添加以下內容:

Options +FollowSymLinks -MultiViews 

<IfModule mod_rewrite.c> 

RewriteEngine on 

# Simple URL redirect: 
RewriteRule ^test.html$ http://arguments.callee.info:8000/test/ [P] 

# More complicated (the user sees only "benchmark.html" in their address bar) 
RewriteRule ^benchmark.html$ http://arguments.callee.info:8000/node?action=benchmark [P] 

# Redirect a whole subdirectory: 
RewriteRule ^node/(.*) http://arguments.callee.info:8000/$1 [P] 

對於DIRECTO ry級別重定向,上面的鏈接建議(。+)規則,它需要'node /'後面的一個或多個字符。我不得不將它轉換爲(。*),這是零或更多我的東西的工作。

非常感謝鏈接@Straseus

+3

請注意,[P]標誌要求啓用Apache的'mod_proxy'。 – 2014-06-20 10:01:29

+0

這是低效的。爲什麼通過簡單的'ProxyPass'來調用Rewrite引擎? – 2015-10-12 13:42:08

41

這個問題屬於更上Server Fault但FWIW我想說的Node.js的前面運行的Apache是​​不是在大多數情況下,一個很好的辦法。

Apache的ProxyPass非常適合很多事情(比如將基於Tomcat的服務作爲網站的一部分),如果你的Node.js應用只是做一個特定的小角色,或者是一個內部工具,它可能只有一個有限的用戶數量,那麼使用它可能會更容易,所以你可以讓它工作並繼續前進,但這聽起來不像這裏的情況。

如果您想充分利用Node.js的性能和規模 - 特別是如果您想使用某些涉及維護像web套接字這樣的持久連接的方法時,最好不要運行Apache和其他端口上的Node.js(例如,本地主機上的Apache:8080,本地主機上的Node.js:3000),然後在前面運行諸如nginx,Varnish或HA代理之類的服務,並以這種方式路由流量。

有了像varnish或nginx這樣的東西,您可以根據路徑和/或主機來路由流量。它們都使用更少的系統資源,並且使用Apache執行相同的操作更具可擴展性。

+6

這個答案應該有更多upvotes。使用nginx代理比使用apache更好一些。 – rerich 2016-01-20 16:46:11

18


說明運行node server沿apache2(v2.4.xx) server

爲了管上的特定網址鏈接到您的Node.js應用程序的所有請求創建CUSTOM.conf文件中/etc/apache2/conf-available目錄,並添加以下行創建的文件:

ProxyPass /node http://localhost:8000/ 

將8000更改爲node server的首選端口號。
用下面的命令啓用自定義配置:

$> sudo a2enconf CUSTOM 

CUSTOM是你沒有擴展新創建的文件名,然後用命令啓用proxy_http

$> sudo a2enmod proxy_http 

應該同時啓用proxyproxy_http模塊。您可以檢查模塊是否啓用或不:

$> sudo a2query -m MODULE_NAME 

配置和模塊啓用後,您將需要重新啓動Apache服務器:

$> sudo service apache2 restart 

現在可以執行節點服務器。所有對URL/node的請求都將由節點服務器處理。

+0

這對我有用,謝謝! – TK123 2017-04-10 02:18:54

+0

這也適用於我! – smaira 2017-04-12 06:43:02

+0

這對我有效! 你救了我的屁股男人。我嘗試了1000種解決方案,但都失敗了! 非常感謝您的解決方案。 – SiriSch 2017-05-27 06:13:38

6

您可以使用不同的方法,例如使用nodejs編寫反向代理服務器來代理apache和所有其他nodejs應用程序。

拳頭您需要在端口80前不同端口上運行Apache:8080端口

,那麼你可以寫一個反向代理腳本作爲的NodeJS:

var proxy = require('redbird')({port: 80, xfwd: false); 

proxy.register("mydomain.me/blog", "http://mydomain.me:8080/blog"); 
proxy.register("mydomain.me", "http://mydomain.me:3000"); 

下面的文章介紹整個過程。

http://wathmal.me/blog/run-apache-with-node-js-reverse-proxy/

0
ProxyPass /node http://localhost:8000/  
  • 這個工作對我來說,當我在上面的httpd-vhosts.conf而非httpd.conf中的條目由
  • 我安裝了XAMPP我的環境&一直在尋找全部命中在端口80上的apache上的流量使用在8080端口上運行的NodeJS應用,即,http://localhost/[name_of_the_node_application]
相關問題