ฉันสามารถแทนที่ Apache ด้วย Node.js ได้หรือไม่


151

ฉันมีเว็บไซต์ที่ทำงานบน CentOS โดยใช้ผู้ต้องสงสัยตามปกติ (Apache, MySQL และ PHP) ตั้งแต่เวลาที่เว็บไซต์นี้เปิดตัวครั้งแรกมันมีการพัฒนาค่อนข้างน้อยและตอนนี้ฉันต้องการทำสิ่งต่าง ๆ ด้วย - กล่าวคือการแจ้งเตือนตามเวลาจริง จากสิ่งที่ฉันได้อ่าน Apache จัดการเรื่องนี้ไม่ดี ฉันสงสัยว่าฉันสามารถแทนที่เพียง Apache ด้วย Node.js (ดังนั้นแทนที่จะเป็น " LAMP " มันจะ "LNMP")

ฉันได้ลองค้นหาวิธีแก้ไขปัญหาออนไลน์แล้ว แต่ยังไม่พบ ถ้าฉันตีความสิ่งที่ฉันอ่านได้อย่างถูกต้องดูเหมือนว่าคนส่วนใหญ่บอกว่า Node.js สามารถแทนที่ทั้ง Apache และ PHP ด้วยกัน อย่างไรก็ตามฉันมีโค้ด PHP อยู่จำนวนมากดังนั้นฉันต้องการเก็บไว้

ในกรณีที่ไม่ชัดเจนฉันค่อนข้างสับสนและสามารถใช้การตรัสรู้ได้ ขอบคุณมาก ๆ!


เซิร์ฟเวอร์ Ape อาจดูคุ้มค่า
TryHarder

คำตอบ:


86

หากคุณพร้อมที่จะเขียน PHP ของคุณใหม่ใน JavaScript แล้วใช่ Node.js สามารถแทนที่ Apache ของคุณ

หากคุณวางอินสแตนซ์ Apache หรือ NGINX ที่ทำงานในโหมด reverse-proxy ระหว่างเซิร์ฟเวอร์ของคุณและลูกค้าของคุณคุณสามารถจัดการคำขอบางอย่างใน JavaScript บน Node.js และคำขอบางอย่างใน PHP ที่โฮสต์โดย Apache จนกว่าคุณจะสามารถแทนที่ PHP ทั้งหมดของคุณได้อย่างสมบูรณ์ ด้วยรหัส JavaScript นี่อาจเป็นสื่อที่มีความสุข: WebSockets ของคุณทำงานใน Node.js ได้มากขึ้นหรือทำงานใน Apache + PHP ได้มากขึ้น


1
ฉันขอขอบคุณการตอบสนองอย่างรวดเร็ว! nginx เหนือกว่า Apache อย่างมากหรือไม่? ฉันมีไฟล์. htaccess อยู่แล้วและจะเป็นการดีถ้าเก็บไว้ นอกจากนี้ฉันได้อ่านแล้วว่าไม่มีประโยชน์ที่จะให้ Apache ส่งต่อการร้องขอไปยัง Node.js เพราะคุณสูญเสียข้อดีของ Node.js เนื่องจากคุณยังคงผ่าน Apache จะดีกว่าไหมถ้าให้ Node.js ฟังพอร์ต 80 สำหรับสิ่งใด ๆ ในโฟลเดอร์ย่อยที่ชื่อว่า "nodejs" แล้วสิ่งใดก็ตามที่ไม่อยู่ในโฟลเดอร์ย่อยนั้นจะถูกส่งผ่านไปยัง Apache โดย Node.js Apache สามารถฟังบนพอร์ตอื่นเช่น 8000
Rick

21
@ Rick ฉันค่อนข้างใกล้จะลบคำตอบของฉันเอง โหนดสามารถใช้sendfileและมีโมดูลสำหรับการสนับสนุนFastCGIที่อาจทำให้ง่ายต่อการให้บริการ PHP ของคุณผ่านทางโหนดเช่นกัน สำหรับ nginx vs Apache ฉันมักจะเป็น sucker สำหรับเซิร์ฟเวอร์แบบ async บนเซิร์ฟเวอร์แบบเธรดหรือมัลติโพรเซสเซอร์ :) แต่ฉันพบเอกสาร Apache ที่ง่ายต่อการค้นหาและอ่าน ฉันจะเรียกว่าการตั้งค่าส่วนตัวถ้าคุณไม่จำเป็นต้องไต่ไปสู่ตัวเลขที่น่าอัศจรรย์ :)
sarnold

3
@Rick คุณไม่ต้องการย้ายข้อมูลการผลิตไปยัง Node ก่อนที่จะเข้าใจว่ามันคืออะไรและทำงานอย่างไร โหนดไม่ใช่ยาวิเศษที่จะทำให้สิ่งต่าง ๆ เร็วขึ้น กระบวนทัศน์ที่ขับเคลื่อนด้วย / async ไม่ใช่เรื่องใหม่และมีเหตุผลว่าทำไมจึงไม่ใช้กับทุกสิ่ง en.wikipedia.org/wiki/Asynchronous_I/O
Øyvind Skaar

1
@Rick แทนที่จะคิดว่าคุณควรจะแทนที่สิ่งที่คุณมีอาจจะดีกว่าถ้าคุณใช้ Node เพิ่มเติม อย่าคิดว่ามีเหตุผลใดที่จะส่งผ่านทุกสิ่งผ่านโหนด (?) ฟังดูเหมือนเป็นความคิดที่ไม่ดี เพียงแค่เรียกใช้โหนดบนพอร์ตหรือโฮสต์อื่น
Øyvind Skaar

2
@ Øyvind Skaar ฉันเห็นด้วย นอกจากนี้สำหรับเว็บไซต์ส่วนใหญ่ (เช่น Wordpress) คอขวดที่แท้จริงคือฐานข้อมูลไม่ใช่การเข้าถึงไฟล์ และหากการเข้าถึงไฟล์นั้นเป็นปัญหาแคชก็จะเป็นทางออกที่ทำงานได้เสมอ อย่างไรก็ตามเพื่อประสิทธิภาพที่แท้จริง PHP-APC เป็นกลโกงราคาถูก
magallanes

26

Node.js อาจเร็วกว่า Apache เนื่องจากเป็นสถาปัตยกรรมที่ไม่ได้มีการบล็อก / ไม่มีการบล็อก แต่คุณอาจมีปัญหาในการค้นหาโมดูล / ไลบรารีซึ่งใช้แทนฟังก์ชันการทำงานของ Apache ได้

Node.js เป็นเฟรมเวิร์กระดับต่ำที่มีน้ำหนักเบาซึ่งช่วยให้คุณสามารถสร้างสิ่งที่ฝั่งเซิร์ฟเวอร์และชิ้นส่วนเรียลไทม์ของเว็บแอปพลิเคชันของคุณได้อย่างรวดเร็ว แต่ Apache มีตัวเลือกการกำหนดค่าที่กว้างขึ้น

ฉันจะบอกว่าถ้าคุณไม่ต้องการแทนที่ PHP ด้วยเฟรมเวิร์กแอปพลิเคชันบนเว็บของ node.js เช่น express.js คุณควรอยู่กับ Apache (หรือคิดถึงการย้ายไปยัง Nginx หากคุณมีปัญหาด้านประสิทธิภาพ)


11

ฉันเชื่อว่า Node.js เป็นอนาคตของการให้บริการเว็บ แต่ถ้าคุณมีรหัส PHP ที่มีอยู่จำนวนมาก Apache / MySQL เป็นทางออกที่ดีที่สุดของคุณ Apache สามารถกำหนดค่าให้กับคำขอพร็อกซีไปยัง Node.js หรือ Node.js สามารถร้องขอไปยัง Apache ได้ แต่ฉันเชื่อว่าประสิทธิภาพบางอย่างจะหายไปในทั้งสองกรณีโดยเฉพาะอย่างยิ่งในกรณีแรก ไม่ใช่เรื่องใหญ่หากคุณไม่ได้ใช้งานเว็บไซต์ที่มีปริมาณการใช้งานสูง

ฉันเพิ่งลงทะเบียนกับ stackoverflow และฉันยังไม่สามารถออกความเห็นเกี่ยวกับคำตอบที่ยอมรับได้ แต่วันนี้ฉันสร้างสคริปต์ Node.js ที่ใช้ sendfile () เพื่อให้บริการไฟล์ผ่านโปรโตคอล HTTP (ตัวอย่างที่มีอยู่แล้วที่คำตอบที่ได้รับการยอมรับลิงก์ใช้เพียงโปรโตคอล TCP เปล่าในการส่งไฟล์และฉันไม่สามารถหาตัวอย่างสำหรับ HTTP ได้ดังนั้นฉันจึงเขียนด้วยตนเอง)

ดังนั้นฉันคิดว่าบางคนอาจพบว่ามีประโยชน์ การให้บริการไฟล์ผ่านการเรียก sendfile () การเรียกใช้ระบบ OS นั้นไม่จำเป็นต้องเร็วกว่าเมื่อมีการคัดลอกข้อมูลผ่านทาง "user land" แต่มันกลับใช้ประโยชน์จาก CPU และ RAM น้อยลงดังนั้นจึงสามารถจัดการการเชื่อมต่อได้มากกว่าวิธีดั้งเดิม

ลิงค์: https://gist.github.com/1350901


2
แม้ว่าจริงมากฉันยังเชื่อว่าถ้าคุณถอด apache down ทำสิ่งที่คุณกำลังอธิบายมันจะทำงานเร็วและถ้าไม่เร็วกว่า node.js Apache ทำหลายสิ่งหลายอย่างที่คนไม่เห็นหรือเข้าใจจริงๆและถ้าคุณเพิ่มการทำงานทั้งหมดของเว็บเซิร์ฟเวอร์เหล่านี้ไปยัง node.js มันก็จะทำงานช้าเหมือนพวกเขา ตัวอย่างง่ายๆน่าจะเป็นmynode.js / getfile? file = / etc / shadow
Rahly

8

ก่อนโพสต์อธิบายสิ่งที่ฉันพูด (php + socket.io + node)

ฉันคิดว่าคุณสามารถติดตั้งโหนดเซิร์ฟเวอร์ใน somehost: 8000 พร้อมกับ socket.io และตบรหัสลูกค้า socket.io ลงในแท็กและด้วยการทำงานที่น้อยที่สุดทำให้แอปที่มีอยู่ของคุณโยกไปมากับ socket.io (โดยเรียลไทม์) โดยไม่ต้องทำงานหนัก

ในขณะที่โหนดสามารถเป็นเซิร์ฟเวอร์แบ็คเอนด์เดียวของคุณโปรดจำไว้ว่าโหนดนั้นชอบที่จะใช้ชื่อของมันและกลายเป็นโหนด ฉันตรวจสอบการพูดคุยชั่วขณะหนึ่งที่ Ryan Dahl มอบให้กับกลุ่มผู้ใช้ PHP และเขาพูดถึงโหนดชื่อที่เกี่ยวข้องกับวิสัยทัศน์ของกระบวนการโหนดหลายอันที่ทำงานและพูดคุยกัน


2

หลอดไฟกับ MEAN ทุกวันนี้ สำหรับการเปรียบเทียบโดยตรงดูhttp://tamas.io/what-is-the-mean-stack

แน่นอนว่า M, E และ A นั้นค่อนข้างผันแปร ตัวอย่างเช่นkoaล่าสุดอาจแทนที่ (E) xpress

อย่างไรก็ตามการแทนที่ Apache ด้วย Node.js อาจไม่ใช่วิธีที่เหมาะสมในการทำให้เว็บสแต็กของคุณทันสมัยขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.