مثال على تطبيق 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
يرجى قراءة Deploy كتطبيق FastCGI أو نشر تطبيق CGI من وثائق Fano Framework لمزيد من المعلومات.
إذا لم يكن لديك Fano CLI مثبتًا ، فأنت بحاجة إلى إعداد مضيف افتراضي يدويًا كما هو موضح في تشغيل قسم خادم الويب في هذا المستند.
افتح متصفح الإنترنت وانتقل إلى 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 Branch of Fano Repository.
نسخ *.cfg.sample إلى *.cfg . قم بالتعديل كما تحتاج في build.cfg ، build.prod.cfg ، build.dev.cfg وقم بتشغيل build.sh shell script (إذا كنت على Windows ، ثم build.cmd ).
تحتوي ملفات *.cfg هذه على بعض مفاتيح برمجيات Pascal المجانية التي يمكنك تشغيلها/إيقاف تشغيلها لتغيير كيفية تجميع وإنشاء تنفيذ. للحصول على شرح كامل على مفاتيح المترجمات المتاحة ، استشر وثائق Pascal المجانية.
قم أيضًا بنسخ src/config/config.json.sample إلى src/config/config.json وتحرير التكوين حسب الحاجة. على سبيل المثال ، قد تحتاج إلى تغيير baseUrl لمطابقة عنوان URL الخاص بك ، بحيث تشير أوراق أنماط JavaScript أو CSS إلى عنوان 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 shell لتبسيط نسخ ملفات التكوين هذه. يتبع الأمر shell يشبه الأمر أعلاه.
$ ./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 Filename.
$ EXEC_OUTPUT_NAME=index.cgi ./build.sh
إعداد مضيف افتراضي. يرجى الرجوع إلى وثائق خادم الويب الذي تستخدمه.
على سبيل المثال على أباتشي ،
<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 أعلاه App.CGI بدلاً من تنفيذها.
على سبيل المثال ، على Debian ، سيمكن هذا وحدة mod_cgi .
$ sudo a2enmod cgi
$ sudo systemctl restart apache2
لنشرها كـ fastcgi ، استبدل خط 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>
و put .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 هو نص bash يمكن استخدامه لتبسيط محاكاة تطبيق التشغيل في shell.
$ ./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 أو البرامج النصية shell في جهاز النشر من أجل تشغيل التطبيق.
لذلك بالنسبة لهذا المستودع ، ستحتاج إلى نسخ الدلائل 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 Syntax Error ، أو "هل نسيت -T؟"
ومع ذلك ، فإن هذا التحذير بسيط ويمكن تجاهله. لا يؤثر على الإخراج القابل للتنفيذ.
في وقت ما ، لا يمكن لـ Pascal Free تجميع الكود الخاص بك لأنه ، على سبيل المثال ، قمت بحذف رمز مصدر الوحدة (.Pas) ولكن الوحدة القديمة التي تم إنشاؤها (.PPU ، .O ، .A) لا تزال موجودة أو عند التبديل بين فروع GIT. الحل هو إزالة تلك الملفات.
بشكل افتراضي ، توجد وحدات تم تجميعها في دليل bin/unit . ولكن لا تقم بحذف ملف README.md داخل هذا الدليل ، لأنه لا يتم تجاهله بواسطة GIT.
$ rm bin/unit/*.ppu
$ rm bin/unit/*.o
$ rm bin/unit/*.rsj
$ rm bin/unit/*.a
سيؤدي الأمر التالي إلى إزالة جميع الملفات داخل دليل bin/unit باستثناء ملف README.md .
$ find bin/unit ! -name 'README.md' -type f -exec rm -f {} +
يتم توفير tools/clean.sh البرنامج النصي لتبسيط هذه المهمة.
يدعم Pascal Free Windows كنظام تشغيل مستهدف ، ومع ذلك ، لم يتم اختبار هذا المستودع بعد على Windows. لاستهداف Windows ، في build.cfg استبدل مفتاح التحويل البرمجي -Tlinux مع -Twin64 وخط Uncomment #-WC ليصبح -WC .
بينما يمكنك استخدام Lazarus IDE ، فهي ليست أداة إلزامية. يجب أن يكون أي محرر نصوص لتحرير التعليمات البرمجية (Atom ، Visual Studio Code ، Sublime ، Vim إلخ) كافيًا.