วิธีการตั้งค่า Python บน FastCGI บน IIS
ต่อไปนี้เป็นวิธีตั้งค่า Python บน FastCGI IIS 7+ พร้อมเปิดทางสำหรับการตั้งค่า DJango ที่เหมาะสม
... และสามารถเชื่อมต่อดีบักเกอร์เข้ากับกระบวนการที่ทำให้คุณสามารถใช้รหัส Python ของคุณ
ตัวอย่างนี้ไม่ได้ใช้คอนโซลการจัดการ IIS แต่จะแสดงรายการเนื้อหาของไฟล์การกำหนดค่าผลลัพธ์
ขั้นตอนที่ 1
ติดตั้ง Python + ตัวดีบั๊ก (ตัวอย่างนี้ใช้ WingIDE ซึ่งฉันพบเครื่องมือที่ยอดเยี่ยม) ตัวอย่างนี้ถือว่าโฟลเดอร์ c: \ python27
ขั้นตอนที่ 2
สร้างเว็บโฟลเดอร์เช่นบน localhost c: \ inetpub \ wwwroot \ mypythonfolder และวางไฟล์ web.config ต่อไปนี้ไว้ในนั้น:
หมายเหตุ | อักขระไพพ์ในคำสั่ง scriptProcessor IIS นี้ใช้เพื่อแมปสคริปต์กับแอปพลิเคชัน fastCgi (ขั้นตอนที่ 3) ควรจับคู่อักขระตามตัวอักษรการตั้งค่า fullpath + pipe character + อาร์กิวเมนต์จากขั้นตอนที่ 3 ด้านล่าง
ขั้นตอนที่ 3
ในไฟล์ applicationHost.config ในโฟลเดอร์ c: \ windows \ system32 \ inetsrc \ config วางสิ่งต่อไปนี้ในส่วน:
<fastCgi>
<application fullPath="c:\python27\python.exe" arguments="c:\python27\lib\mylib\myfcgi.py" monitorChangesTo="C:\Python27\Lib\r4a\r4afcgi.py" stderrMode="ReturnStdErrIn500" maxInstances="4" idleTimeout="300" activityTimeout="300" requestTimeout="90" instanceMaxRequests="200" protocol="NamedPipe" queueLength="1000" flushNamedPipe="true" rapidFailsPerMinute="10" />
</fastCgi>
ขั้นตอนที่ 4
ใน c: \ python27 \ lib \ mylib \ myfcgi.py ใส่รหัสต่อไปนี้:
import wingdbstub
นำเข้าระบบปฏิบัติการ, io, sys ret = "สภาพแวดล้อม: \ r \ n" สำหรับพารามิเตอร์ใน os.environ.keys (): ret = ret + "% s =% s \ r \ n"% (พารามิเตอร์, os.environ [ param]) ret = ret + "\ r \ nArgs:" สำหรับ ARG ใน sys.argv: ret = ret + ARG จัดการ = io.open ("c: \ temp \ myfcgi.log", 'wb') handle.write (ret) หมายเลขอ้างอิงปิด ()
ขั้นตอนที่ 5
ตรวจสอบให้แน่ใจว่า IUSR มีสิทธิ์เขียนลงในโฟลเดอร์ c: \ temp ของคุณ
ขั้นตอนที่ 6
วาง wingdbstub.py และ wingdebugpw ไว้ในโฟลเดอร์ c: \ python27 \ lib \ mylib \ ของคุณ สิ่งนี้จะช่วยให้การดีบักใน wingide ไฟล์เหล่านี้มีให้พร้อมกับการติดตั้งแบบปีกของคุณ หมายเหตุ: ถ้า Python ต้องการคอมไพล์โค้ดของคุณใน wingstub.pyc IUSR จำเป็นต้องมีสิทธิ์ในการเขียนในโฟลเดอร์นั้นเนื่องจากกระบวนการ Python จะถูกเปิดใช้งานภายใต้บัญชีนั้นโดย IIS
ขั้นตอนที่ 6
เปิด wingdb และตั้งค่าเบรกพอยต์บนบรรทัด 'import os, io, sys'
ขั้นตอนที่ 7
เข้าสู่เบราว์เซอร์ของคุณที่http: // localhost / mypythonfolder
หากทุกอย่างทำงานถูกต้องตอนนี้ควรถูกเรียกใช้ปีกเพื่อแสดงรหัสการทำงานที่เบรกพอยต์ของคุณ ถ้าไม่: - อาจมีปัญหาไฟร์วอลล์ กระบวนการหลามสื่อสารกับอินเทอร์เฟซ WingIDE ผ่านการเชื่อมต่อ tcp หรือมีปัญหาด้านความปลอดภัยภายใน wingide มันต้องการไฟล์ wingdebugpw รุ่นที่เหมาะสมซึ่งโดยทั่วไปจะมีรหัสผ่านหรือโทเค็นที่ตรวจสอบการเข้าถึงการติดตั้ง wingide ของคุณ หากไม่ใช่กรณีนี้ใครก็ตามที่มีการเข้าถึง tcp ไปยังพีซีของคุณสามารถดีบักรหัสของคุณได้
ขั้นตอนที่ 8
ตรวจสอบว่าใน c: \ temp logfile จะถูกสร้างขึ้น สิ่งนี้จะทำงานได้หากคุณไม่สามารถทำขั้นตอนที่ 7
ขั้นตอนที่ 9
โปรดทราบว่าหน้านี้จะเปิดใช้งานตัวดีบั๊ก แต่จะไม่ส่งคืนหน้าใด ๆ ไปยังเว็บเบราเซอร์ พื้นหลังบางส่วน: เว็บเซิร์ฟเวอร์สื่อสาร fastcgi ผ่านที่เรียกว่า 'บันทึก' ซึ่งหมายความว่าคำขอของผู้ใช้แต่ละรายจะมาในแอปพลิเคชันของคุณซึ่งบรรจุใน 'บันทึก' แยกกันหลายรายการ แต่ละระเบียนเป็นโครงสร้างข้อมูลที่บ่งชี้ว่าจุดเริ่มต้นของการร้องขอสตริงการสืบค้นตัวแปรโพสต์ ฯลฯ ที่ยกเลิกการบรรจุของระเบียนเหล่านี้เพื่อคำขอเดียวเป็นชนิดของยุ่งยากมันเป็นไปตามข้อกำหนดของ fastcgi
http: //www.fastcgi .com / devkit / doc / FCGI-spec.html # S1
ในฐานะที่เป็นเนื้อหาของ c: \ python27 \ lib \ mylib \ myfcgi.py ฉันเพิ่งวางสำเนาของ zoofcgi.py ที่ให้ไว้โดย helicontech ไฟล์ไพ ธ อนนี้สามารถถอดรหัสบันทึกเหล่านี้และให้บริการหน้าและค่อนข้างน่าสนใจในการแก้ปัญหา นอกจากนี้โปรดทราบว่า helicontech มีตัวเลือก dll ที่อยู่ระหว่าง IIS และ zoofcgi.py แต่ dll นี้ไม่จำเป็นอย่างเคร่งครัด ฉันเชื่อว่ามีการใช้งาน fastcgi รุ่นปรับปรุงเล็กน้อยและทั่วไปที่ msft นำเสนอ อย่างไรก็ตามเมื่อคุณใช้ dll ของพวกเขาเมื่อคุณต้องการที่จะก้าวผ่านรหัสของคุณกระบวนการจะถูกยกเลิกค่อนข้าง Quicly และ IIS / DLL ฆ่ากระบวนการหลามของคุณเมื่อมันสรุปว่าไม่มีการตอบสนองกลับมาภายในไม่กี่วินาทีหรือ 2
แค่นั้นแหละ. โดยหลักการแล้วการสื่อสารระหว่าง IIS และรหัสไพ ธ อนของคุณจะทำกับไพพ์ที่มีชื่อ คุณควรจะสามารถตั้งค่าโดยใช้ซ็อกเก็ต tcp แต่ฉันไม่สามารถคิดได้ว่าพอร์ตใดที่ใช้ (ฉันเชื่อว่า stdin ควรเปลี่ยนเป็นพอร์ตซึ่งสามารถเลือกได้) แต่ฉันไม่ได้ให้สิ่งนั้น ความพยายามใด ๆ )