ตัวอย่างเว็บแอปพลิเคชัน FastCGI โดยใช้ Fano Framework, Pascal Web Application Framework มันจะย้อนกลับไปยังแอปพลิเคชัน CGI เมื่อไม่รองรับ FastCGI
โครงการนี้สร้างขึ้นโดยใช้เครื่องมือบรรทัดคำสั่ง FANO CLI เพื่อช่วยให้เว็บแอปพลิเคชันนั่งร้านโดยใช้ Fano Framework
$ git clone [email protected]:fanofamework/fano-cgi-fcgi.git --recursive
$ ./tools/config.setup.sh
$ ./build.sh
หากคุณติดตั้ง Fano CLI คุณสามารถตั้งค่าการกำหนดค่าโฮสต์เสมือนเป็น FastCGI โดยใช้โมดูล mod_fcgid โดยเรียกใช้
$ sudo fanocli --deploy-cgid=cgi-fcgi.fano
หรือเป็นแอปพลิเคชัน CGI
$ sudo fanocli --deploy-cgi=cgi-fcgi.fano
โปรดอ่านการปรับใช้เป็นแอปพลิเคชัน FastCGI หรือปรับใช้เป็นแอปพลิเคชัน CGI จากเอกสาร Fano Framework สำหรับข้อมูลเพิ่มเติม
หากคุณไม่ได้ติดตั้ง Fano CLI คุณจะต้องตั้งค่าโฮสต์เสมือนจริงด้วยตนเองตามที่แสดงใน Run ด้วยส่วนเว็บเซิร์ฟเวอร์ ของเอกสารนี้
เปิดเบราว์เซอร์อินเทอร์เน็ตและไปที่ URL http: //cgi-fcgi.fano
ตรวจสอบให้แน่ใจว่าติดตั้ง Pascal ฟรี วิ่ง
$ fpc -i
หากคุณเห็นอะไรบางอย่างเช่น Free Pascal Compiler version 3.0.4 คุณก็พร้อมที่จะไป
โคลนที่เก็บนี้
$ git clone [email protected]:fanofamework/fano-cgi-fcgi.git --recursive
--recursive จำเป็นต้องได้รับการฟื้นฟูดังนั้น Git จึงดึงที่เก็บ Fano
หากคุณหายไป --recursive เมื่อคุณโคลนคุณอาจพบว่าไดเรกทอรี vendor/fano นั้นว่างเปล่า ในกรณีนี้รัน
$ git submodule update --init
หากต้องการอัปเดต Fano เป็นคอมมิชชันล่าสุด Run
$ git checkout master && git submodule foreach --recursive git pull origin master
คำสั่งด้านบนจะชำระเงินไปยังสาขา master ของที่เก็บนี้และดึงการอัปเดตล่าสุดจากสาขา master ของที่เก็บ Fano
คัดลอก *.cfg.sample ถึง *.cfg ทำการปรับตามที่คุณต้องการใน build.cfg , build.prod.cfg , build.dev.cfg และเรียกใช้ shell shell build.sh (ถ้าคุณอยู่บน windows จากนั้น build.cmd )
ไฟล์ *.cfg เหล่านี้มีสวิตช์คอมไพเลอร์ Pascal ฟรีบางส่วนที่คุณสามารถเปิด/ปิดเพื่อเปลี่ยนวิธีการรวบรวมและสร้างการทำงานได้ สำหรับคำอธิบายที่สมบูรณ์เกี่ยวกับสวิตช์คอมไพเลอร์ที่มีอยู่ให้ปรึกษาเอกสาร Pascal ฟรี
นอกจากนี้ยังคัดลอก src/config/config.json.sample ไปยัง src/config/config.json และแก้ไขการกำหนดค่าตามต้องการ ตัวอย่างเช่นคุณอาจต้องเปลี่ยน baseUrl เพื่อให้ตรงกับ URL พื้นฐานของคุณเองดังนั้น JavaScript หรือ CSS Stylesheets ชี้ไปที่ URL ที่ถูกต้อง
$ cp config/config.json.sample config/config.json
$ cp build.prod.cfg.sample build.prod.cfg
$ cp build.dev.cfg.sample build.dev.cfg
$ cp build.cfg.sample build.cfg
$ ./build.sh
tools/config.setup.sh เชลล์มีให้เพื่อการคัดลอกไฟล์การกำหนดค่าเหล่านั้นง่ายขึ้น คำสั่งเชลล์ต่อไปนี้คล้ายกับคำสั่งด้านบน
$ ./tools/config.setup.sh
$ ./build.sh
โดยค่าเริ่มต้นจะส่งออกไบนารีที่เรียกใช้งานได้ในไดเรกทอรี public
หากต้องการสร้างสำหรับสภาพแวดล้อมที่แตกต่างกันให้ตั้งค่าตัวแปรสภาพแวดล้อม BUILD_TYPE
$ BUILD_TYPE=prod ./build.sh
กระบวนการสร้างจะใช้การกำหนดค่าคอมไพเลอร์ที่กำหนดไว้ใน vendor/fano/fano.cfg , build.cfg และ build.prod.cfg โดยค่าเริ่มต้น build.prod.cfg จะมีสวิตช์คอมไพเลอร์บางตัวที่จะเพิ่มประสิทธิภาพการทำงานให้เหมาะสมทั้งในความเร็วและขนาด
$ BUILD_TYPE=dev ./build.sh
กระบวนการสร้างจะใช้การกำหนดค่าคอมไพเลอร์ที่กำหนดไว้ใน vendor/fano/fano.cfg , build.cfg และ build.dev.cfg
หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม BUILD_TYPE สภาพแวดล้อมการผลิตจะถูกสันนิษฐาน
การรวบรวมจะส่งออกไปยังไดเรกทอรีที่กำหนดไว้ในตัวแปรสภาพแวดล้อม EXEC_OUTPUT_DIR โดยค่าเริ่มต้นคือไดเรกทอรี public
$ EXEC_OUTPUT_DIR=/path/to/public/dir ./build.sh
การรวบรวมจะใช้ชื่อไฟล์ที่เรียกใช้งานได้ตามที่กำหนดไว้ในตัวแปรสภาพแวดล้อม EXEC_OUTPUT_NAME โดยค่าเริ่มต้นคือ app.cgi ชื่อไฟล์
$ EXEC_OUTPUT_NAME=index.cgi ./build.sh
ตั้งค่าโฮสต์เสมือนจริง โปรดปรึกษาเอกสารเกี่ยวกับเว็บเซิร์ฟเวอร์ที่คุณใช้
ตัวอย่างเช่น apache
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /home/example/public
<Directory "/home/example/public">
Options +ExecCGI
AllowOverride FileInfo
Require all granted
DirectoryIndex app.cgi
AddHandler cgi-script .cgi
</Directory>
</VirtualHost>
บน Apache คุณจะต้องเปิดใช้งานโมดูล CGI เช่น mod_cgi หรือ mod_cgid หากโมดูล CGI ไม่ได้โหลดไว้ข้างบนโฮสต์เสมือนจริงจะทำให้ app.cgi ถูกดาวน์โหลดแทนการดำเนินการ
ตัวอย่างเช่นบน Debian สิ่งนี้จะเปิดใช้งานโมดูล mod_cgi
$ sudo a2enmod cgi
$ sudo systemctl restart apache2
หากต้องการปรับใช้เป็น fastCGI ให้แทนที่ Line AddHandler ด้านบนด้วย
AddHandler fcgid-script .cgi
ขึ้นอยู่กับการตั้งค่าเซิร์ฟเวอร์ของคุณตัวอย่างเช่นหากคุณใช้ .htaccess เพิ่มรหัสต่อไปนี้:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.cgi [L]
</IfModule>
และใส่ไฟล์ .htaccess ในไดเรกทอรีเดียวกับไฟล์ app.cgi (เช่นในไดเรกทอรี public )
เนื้อหาของ .htaccess โดยทั่วไปจะบอก Apache ให้บริการไฟล์/ไดเรกทอรีที่มีอยู่โดยตรง สำหรับไฟล์/ไดเรกทอรีที่ไม่มีอยู่จริงใด ๆ ให้ส่งผ่านไปยังแอปพลิเคชันของเรา
$ cd public
$ REQUEST_METHOD=GET
REQUEST_URI=/test/test
SERVER_NAME=juhara.com
./app.cgi
tools/simulate.run.sh เป็นสคริปต์ทุบตีที่สามารถใช้เพื่อลดความซับซ้อนของแอปพลิเคชันการเรียกใช้การจำลองในเชลล์
$ ./tools/simulate.run.sh
หรือเพื่อเปลี่ยนเส้นทางไปสู่การเข้าถึงให้ตั้งค่าตัวแปร REQUEST_URI
$ REQUEST_URI=/test/test ./tools/simulate.run.sh
นี่คล้ายกับการจำลองเบราว์เซอร์ที่ร้องขอหน้านี้เช่น
$ wget -O- http://[your fano app hostname]/test/test
อย่างไรก็ตามการใช้งานโดยใช้ tools/simulate.run.sh ช่วยให้คุณสามารถดูเอาต์พุตของหน่วย heaptrc สำหรับการตรวจจับการรั่วไหลของหน่วยความจำ (หากคุณเปิดใช้งานสวิตช์ -gh ใน build.dev.cfg )
คุณต้องปรับใช้เฉพาะไบนารีที่เรียกใช้งานได้และไฟล์ที่รองรับใด ๆ เช่นเทมเพลต HTML รูปภาพสไตล์ CSS สไตล์การกำหนดค่าแอปพลิเคชัน ไม่จำเป็นต้องใช้ไฟล์ pas หรือ inc หรือสคริปต์เชลล์ในเครื่องปรับใช้เพื่อให้แอปพลิเคชันรัน
ดังนั้นสำหรับที่เก็บนี้คุณจะต้องคัดลอก public Templates config และ storages ไดเรกทอรีไปยังเครื่องปรับใช้ของคุณ ตรวจสอบให้แน่ใจว่าไดเรกทอรี storages สามารถเขียนได้โดยเว็บเซิร์ฟเวอร์
เมื่อเรียกใช้สคริปต์ build.sh คุณอาจพบคำเตือนต่อไปนี้:
/usr/bin/ld: warning: public/link.res contains output sections; did you forget -T?
นี่เป็นปัญหาที่รู้จักกันระหว่าง Pascal และ GNU Linker ฟรี ดูคำถามที่พบบ่อย: link.res ไวยากรณ์ข้อผิดพลาดหรือ "คุณลืม -t?"
อย่างไรก็ตามคำเตือนนี้มีน้อยและสามารถเพิกเฉยได้ มันไม่ส่งผลกระทบต่อเอาต์พุต
บางครั้ง Pascal ฟรีไม่สามารถรวบรวมรหัสของคุณได้เนื่องจากตัวอย่างเช่นคุณลบซอร์สโค้ดหน่วย (.pas) แต่หน่วยที่สร้างขึ้นเก่า (.ppu, .o, .a ไฟล์) ยังคงอยู่ที่นั่นหรือเมื่อคุณสลับระหว่างกิ่งก้าน วิธีแก้ปัญหาคือการลบไฟล์เหล่านั้น
โดยค่าเริ่มต้นหน่วยคอมไพล์ที่สร้างขึ้นจะอยู่ในไดเรกทอรี bin/unit แต่อย่าลบไฟล์ README.md ภายในไดเรกทอรีนี้เนื่องจากไม่ได้ถูกเพิกเฉยโดย Git
$ rm bin/unit/*.ppu
$ rm bin/unit/*.o
$ rm bin/unit/*.rsj
$ rm bin/unit/*.a
คำสั่ง shell ต่อไปนี้จะลบไฟล์ทั้งหมดภายในไดเรกทอรี bin/unit ยกเว้นไฟล์ README.md
$ find bin/unit ! -name 'README.md' -type f -exec rm -f {} +
tools/clean.sh สคริปต์มีให้เพื่อให้งานนี้ง่ายขึ้น
Free Pascal รองรับ Windows เป็นระบบปฏิบัติการเป้าหมายอย่างไรก็ตามที่เก็บนี้ยังไม่ได้ทดสอบบน Windows ในการกำหนดเป้าหมาย windows ใน build.cfg แทนที่สวิตช์คอมไพเลอร์ -Tlinux ด้วย -Twin64 และสายการเขียนบท #-WC เพื่อเป็น -WC
ในขณะที่คุณสามารถใช้ Lazarus IDE แต่ก็ไม่ใช่เครื่องมือบังคับ ตัวแก้ไขข้อความใด ๆ สำหรับการแก้ไขรหัส (อะตอม, รหัสสตูดิโอภาพ, ประเสริฐ, vim ฯลฯ ) ควรพอเพียง