گیک فارسی

نوشته های یک گیک فارسی از فعالیت ها ،‌ علاقه مندی ها و نقد هایش

دانلود راحت با قابلیت Resume بخصوص برای فایل های بزرگ بدون دخالت PHP

نویسنده:
29 سپتامبر 15

خیلی مواقع برای دانلود فایل نیاز هست از طریق PHP و بدون در اختیار گذاشتن لینک مستقیم امکان دانلود را برای کاربر فراهم کنیم اینطوری :

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="PATH_TO_FILE"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: FILE_SIZE');
readfile("PATH_TO_FILE");
exit;

اما مشکل اون موقع پیش میاد که حجم فایل زیاد باشه و نیاز به resume باشه که البته اون را هم میشه با PHP حلش کرد و شاید یک نمونه را در آینده پُست کردم ولی راهکاری که میخوام براتون توضیح بدم به نظرم خیلی بهتره چون کل پروسه دانلود را میندازیم گردن Apache و کار خیلی تمیز تر و بهتر انجام میشه.

دانلود x-sendfile

در‌واقع میخوایم از ماژول x-sendfile که توی وب سرور های مختلف مثل apache و nginx و litespeed فرق میکنه استفاده کنیم. من فرض میکنم شما روی دبیان و وب سرور Apache میخواین نصبش کنید.

برای نصب ماژول باید از دستور apxs استفاده کنیم که ممکنه روی سیستم نصب نباشه و با دستور زیر میتونیم نصبش کنیم :

apt-get install apache2-dev

حالا سورس ماژول را از https://tn123.org/mod_xsendfile و بخش دانلود میگیریم و آرشیو را باز میکنیم و با دستور زیر ماژول را نصب میکنیم :
[doce]
sudo apxs -cia mod_xsendfile.c
[/code]
تا اینجا ماژول را نصب کردیم ولی باید برای سایت یا کل سرور فعال کنیم که میتونیم این کار را توی فایل httpd.conf یا apache2.conf یا از طریق htaccess. انجام بدین که من این آخری را ترجیح میدم. مثلاً دانلود را از طریق فایل xdownload.php انجام میدم پس توی htaccess. مینویسم :

<Files xdownload.php>
	XSendFile on
</Files>

آخرین کاری که باید انجام بدیم اینه که تعیین کنیم Apache برای Header های X-Sendfile به کدام دایرکتوری رجوع کنه که حتماً باید توی فایل‌های config سرور یا سایت این کار را انجام بدیم :

<VirtualHost *:80>
        ServerAdmin webmaster@domain.com
        ServerName www.domain.com
        DocumentRoot /path/to/www
        XSendFilePath /path/to/www/xdownload

	... other stuff
</VirtualHost>

همونطور که میبینید من برای سایتم یک دایرکتوری xdownload در نظر گرفتم و فایل‌هایی که میخوام دانلود کنم را میریزم توی اون دایرکتوری. شما با توجه سایت خودتون میتونید هر دایرکتوری را در نظر بگیرین.

حالا با دستور زیر apache را ریست میکنیم :

sudo service apache2 restart

و با بهترین روش ممکن فایل را برای دانلود عرضه میکنیم :

header("X-Sendfile: xdownload/file.ext");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=file.ext");
exit;

اینکه اشاره کردم با دبیان انجام میدم برای این بود که دستور هایی مثل apt-get را با دبیان مینویسم وگرنه هیچ اهمیتی نداره از چه لینوکسی استفاده میکنید و فقط باید سرویس دهنده شما apache باشه.

از کجا بفهمیم یک سایت از چه سیستم عامل ،‌ سرویس دهنده وب و زبان برنامه نویسی استفاده میکنه ؟

نویسنده:
6 آگوست 15

یکی از مباحثی که در انجمن‌ها و جوامع برنامه نویسان وب مطرح هست این موضوعه که چه وب سایت‌های موفقی از زبان برنامه نویسی مورد علاقه من استفاده میکنند !؟ گذشته از اینکه این سؤال به نظر من اصلاً مهم نیست چون من دوستان برنامه نویس موفقی دارم که از Scala برای توسعه وب استفاده میکنند در حالی که پروژه خیلی موفق و دهن پر کنی هم در موردش وجود نداره در عوض میشه این موضوع را بهانه قرار داد تا یاد بگیریم چطور میشه خیلی ساده تشخیص داد یک سایت از چه سیستم عامل ، سرویس دهنده وب و زبان برنامه نویسی استفاده میکنه.

مدیر سیستم ،‌تحلیل شبکه

شاید اولین اشتباه در نگاه اول به یک سایت این باشه که از روی پسوند فایل‌ها استنباط کنیم که از چه زبان برنامه نویسی و سیستم عامل و … داره استفاده میشه که البته خیلی قابل اطمینان نیست چون واقعاً براحتی از طریق یک فایل htaccess. روی سیستم عامل لینوکسی میشه فایل‌ها با پسوند aspx را دوباره نویسی (URL Rewriting) کرد یا حتی از سرویس دهنده وب بخوایم پسوند aspx را به عنوان یک پسوند معتبر برای PHP فرض کنه.

من نمیخوام وارد بحث‌های کارآگاهی و تخصصی شبکه و بررسی پورت های سرویس دهنده و موارد پیچیده بشم. موردی هم که میخوایم از طریقش بررسی را انجام بدیم توسط یک مدیر سرور قابل دستکاریه که یک نمونه هم معرفی میکنم اما عموما این اتفاق نمیفته و از طریق Header هایی که سرویس دهنده میفرسته میشه فهمید اون پشت چه خبره !

دستوری که میخوایم ازش استفاده کنیم خیلی سادست ، مثلاً بیاین سایت digikala.com را بررسی کنیم :

curl -s -I digikala.com

که این خروجی را بر میگردونه :

HTTP/1.1 301 Moved Permanently
Content-Length: 147
Content-Type: text/html; charset=UTF-8
Location: http://www.digikala.com/
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 05 Aug 2015 22:53:37 GMT

که ازش متوجه میشیم داره از سیتم عامل ویندوز ، IIS7.5 به عنوان سرویس دهنده و زبان ASP .NET استفاده میکنه.

اما همیشه هم نمیشه ۱۰۰ درصد در مورد یک یا چند مورد از سوالاتمون اطمینان حاصل کنیم ، مثلاً خروجی سایت Ponisha.ir :

HTTP/1.0 200 OK
Date: Wed, 05 Aug 2015 22:59:54 GMT
Server: Apache/2
X-Powered-By: PHP/5.5.27
Set-Cookie: PonishaSession=kbt88b72ms7p9nk2l9bpnqiiu7; path=/; domain=.ponisha.ir
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: User-Agent
Content-Type: text/html
Connection: close

مشخصه که سرویس دهنده Apache هست و زبان برنامه نویسی PHP 5.5 اما با اطمینان نمیتونیم بگیم داره از سرویس دهنده لینوکسی استفاده میکنه چون روی ویندوز هم قابل استفاده هست اما در حالت نرمال و حرفه‌ای ۹۵ درصد میشه اطمینان داشت سیستم عامل از خانواده لینوکس یا یونیکس هستش.

همونطور که گفتم مدیر سیستم میتونه این اطلاعات را دستکاری کنه ، مثلاً خروجی mihanblog.com را اگه ببینید :

HTTP/1.0 200 OK
Date: Wed, 05 Aug 2015 23:04:46 GMT
Content-Type: text/html
Set-Cookie: mib_lb_id=m0; path=/; domain=.mihanblog.com
Cache-Control: no-cache, must-revalidate, no-cache="Set-Cookie", private
Vary: Accept-Encoding
Server: Toofun/1.0.1
Connection: close

هموطنر که میبینید تنها موردی که برمیگردونه سرویس دهنده هست که اون را Toofun معرفی میکنه اما من که چنین سرویس دهنده ای را نمیشناسم اما گویا سایت‌های cloob.com و aparat.com هم چنین خروجیی را بر میگردونه (به نظر میاد مالک همشون یک گروه باشه) اما با کمی مطالعه دقیقتر و مراجعه به آرشیو های سایت‌های موجود و دیدن ردپای nginx میشه حدس زد شاید Forky ی از اون باشه اما نمیشه صد در صد گفت.

یادتونه گفتم به پسوند فایل‌ها اعتماد نکنید ؟ خوب اگه خروجی سایت بانک ملت را ببینیم :

HTTP/1.0 301 Moved Permanently
Cache-Control: private
Content-Length: 150
Content-Type: text/html; charset=utf-8
Location: http://bankmellat.ir/default.aspx
Server: Apache/2.2.3 (Linux/SUSE)
Date: Wed, 05 Aug 2015 23:11:28 GMT
Connection: close

داره میگه سرویس دهده Apache روی لینوکس SUSE اما پسوند فایل Header مربوط به Location که داره Redirect میکنه aspx هست. استنباط اینکه داره برای گمراهی پسوند را عوض میکنه خیلی قوی‌تر از این هست که فکر کنیم IIS داره خروجی گمراه‌کننده برای جا زدن خودش به عنوان Apache تولید میکنه.

انتقال (Redirect) دامنه های فرعی به اصلی

نویسنده:
10 آوریل 15

اگه طراح وب باشید به احتمال زیاد به شرایطی برخورد کردین که شما یا مشتری پیشنهاد میدین هم دامنه ir و هم دامنه com و در شرایط حادتری چند دامنه مرتبط یا شبیه دامنه اصلی را ثبت کنید. قطعاً index شدن یک محتوا در چند دامنه برای سئو سایت مناسب نیست و دامنه های فرعی بایستی به دامنه های اصلی انتقال پیدا کنند.

بدترین اتفاق مخصوصاً در مورد دامنه های ir این هست که برای redirect از طریق ثبت کننده دامنه باید پول اضافی بدین و حتی اگه ثبت کننده شما انتقال را براتون انجام بده معمولاً فقط نام مثلاً domain1.com به domain.com منتقل میشه ، حالا اگه شما صفحه about-us به نشانی domain.com/about-us داشته باشین و کاربری صفحه domain1.com/about-us را بزنه به صفحه index دامنه domain.com انتقال پیدا میکنه.

حالا برای اینکه هم هزینه اضافی نکنیم و هم هر صفحه‌ای با هر مسیری که زده میشه به دامنه اصلی و همون صفحه انتقال داده بشه باید از htaccess. استفاده کنیم :

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !domain.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]

برای توضیح بیشتر :
خط ۱ : Rewrite (بازنویسی) را فعال میکنیم.
خط ۲ : بازنویسی بر پایه ریشه انجام میشه.
خط ۳ : مقدار شرطی برای خط بعد هست و میگه اگه هاست مربوط به URL درخواستی (منظور همون domain.com یا domain1.com بدون www هست) برابر با domain.com نبود (NC یعنی به حروف بزرگ و کوچیک حساس نشو !)
خط ۴: منظور از *. اینه که هر چی بعد از نام هاست در ادامه URL بود را با دامنه domain.com فراخوانی کن ! (L یعنی دیگه شرایط و حالت های بعدی را نمیخواد بررسی کنی و کار را تموم کن. R=301 هم میگه کلاً مسیر را اشتباه اومدی و از این به بعد مسیری که من دارم بهش انتقال میدم را در نظر بگیر که این برای موتور های جستجو معنی داره)

حالا اگه ۱۰۰ تا دامنه را هم توی cpanel روی هاستتون Park کنید.با هر دامنه و مسیری که کاربران توی مرورگرشون بزنن به دامنه domain.com که دامنه اصلی هست و همون مسیر درخواستی منتقل میشوند.

رقابت Nginx و Apache در چند سال اخیر و اقبال بیشتر Nginx

نویسنده:
19 فوریه 15

اگر تا به حال مدیریت یک سایت را بر روی یک Server اختصاصی حالا چه Dedicated یا VPS تجربه کرده باشین میدونین که انتخاب یک سرویس دهنده و تنظیمات درستش یکی از مهمترین چالش های مدیریت Server هست.

مقایسه سرویس دهنده ها ۱

اولین نامی که در ذهن برای سرویس دهنده وب متبادر میشه قطعاً Apache هستش. آپاچی از سال ۱۹۹۵ تا کنون مقام اول در سرویس دهی به میلیون‌ها وب سایت را بر عهده داشته ، کاربران بسیاری داره ، ماژول های زیادی در راستای بهبود و توسعه امکاناتش براش نوشته شده و در جامعه سورس باز هم جایگاه تعریف شده و مهمی داره. اما چه دلیلی باعث میشه که با این تفاسیر بخواهیم به سرویس دهنده های دیگه فکر کنیم ؟

آپاچی وقتی با ترافیک بالا روبرو میشه کند میشه و این موضوع دلیلی نداره جز افزایش Process ها که قاتل Memory هستند و علاوه بر اون این Process ها با ایجاد Thread ها بر جنگ دسترسی به منابع Memory و CPU دامن میزنن. حتی با وجود MPM هایی مثل worker و event علاوه بر pre_fork باز هم Apache با مشکلات Process ها و Thread هاش دست به گریبان هست و زمانی که ترافیک افزایش پیدا میکنه با کندی مواجه میشه و گاهی اوقات با توجه به تنظیماتش کلاً مانع از دسترسی کاربران به سایت میشه.

در مقابل Apache انتخاب های دیگه ای هم وجود داره که Nginx در بینشون اقبال بیشتری داشته اما چرا ؟ بر خلاف Apache که با ایجاد Process ها و Thread های جدید درخواست های کاربر را پاسخ میده ، Nginx به صورت Event Driven و Asynchronous با توجه به تنظیمات مدیر سیستم که تعداد Worker Process ها را تعین میکنه و هر Process فقط یک Thread داره و میتونه هزاران کاربر را پاسخگو باشه کار میکنه.این تفاوت عملکرد تأثیر خیلی زیادی داره و Nginx را Stable تر و سریعتر میکنه. همین افزایش سرعت باعث میشه بسیاری از مدیران سیستم به سمت Nginx تمایل پیدا کنند و محبوب بشه.

مقایسه سرویس دهنده ها ۲

یکی از ایراد هایی که به Nginx گرفته میشه این هست که برای کار با محتوای دینامیک بر خلاف Apache که با ماژول هایی نظیر mod_php و mod_python و mod_rails و mod_rack میتونه مانع از اجرای هر بار Interpreter اون زبان بشه عمل میکنه و در این زمینه کند خواهد بود.

اخیراً دو تا پروژه وب سایت روی Server اختصاصی VPS را شروع کردم و با توجه به مطالبی که در مورد Nginx خونده بودم میخواستم امتحانش کنم و ببینم چقدر از Apache بهتر عمل میکنه. البته من با استفاده از php-fpm روی Nginx اصلاً مشکل سرعت برای php که در پاراگراف بالا اشاره کردم را احساس نکردم و در کل به نظرم خیلی بهتر از Apache جواب میده.مشکل بزرگی که داشتم عدم پشتیبانی از htaccess. برای همون بحث سرعت بود که تونستم به روش Nginx مشکلاتش را حل کنم.

شما هم میتونین روی سیستم Local خودتون Nginx را امتحان کنید و از سرعت بالاش در پروژه های بعدی بهره ببرید.

مهاجرت به لینوکس | نصب و راه اندازی سرویس های مورد نیاز یا همون LAMP

نویسنده:
10 ژوئن 14

پیرو نوشته‌ای که با عنوان «مهاجرت به لینوکس | اوبونتو در کنار ویندوز» منتشر کردم. در چهارمین مرحله و پس از نصب سیستم عامل حالا نوبت میرسه به اینکه سرویس های مورد نیاز یک برنامه نویس وب را نصب کنیم. این سرویس ها شامل سرویس دهنده وب یعنی Apache ، زبان برنامه نویسی سمت وب یعنی PHP و پایگاه داده MySQL می‌شود که روش نصب هر کدام را توضیح می دهم.

قبل از شروع به نصب سرویس های مورد نیاز باز هم یاد آوری می‌کنم که بهتره ابتدا در مورد سیستم عامل جدید یعنی Ubuntu Linux آشنایی متوسطی پیدا کنید تا بتونین دستورات را اجرا کنین و فایل‌های تنظیمات را ویرایش و کار های مرتبط را انجام بدین. بهتره عجله نکنید و چند هفته‌ای را برای یادگیری سیستم عامل جدید وقت بگذارید. همیشه میتونین سؤالات خودتون را توی انجمن فارسی کاربران اوبونتو بپرسین تا دوستان من و شاید خود من در اون انجمن شما را راهنمایی کنن.

Apache
توی لینوکس سرویس دهنده های زیادی هست که میشه نصب کرد ولی من Apache را ترجیح میدم و نصب و راه اندازی Apache را توضیح میدم. برای نصب Apache توی Ubuntu و پس از زدن Ctrl + Alt + T و نمایان شدن ترمینال میزنیم :

sudo apt-get install apache2

ممکنه در زمان نصب یک Wizard ازتون سؤالاتی در مورد domain یا port یا هر تنظیماتی بپرسه که میتونید مقادیر پیش‌فرض را قبول کنین و یا اگه میدونین دارین چیکار میکنین اونها را مطابق خواسته خودتون تغییر بدین. بعد از نصب Apache اگه توی آدرس مرورگر خودتون (ترجیحاً Firefox ;)) بزنین http://localhost صفحه پیش‌فرض Apache را مشاهده میکنین که نوشته !It Works. مسیر پیش‌فرض Apache برای این وب سایت هم var/www/ هستش و میتونین فایل‌های html یا php و … را توی این پوشه بریزین دقیقاً مثل زمانی که فایل‌ها را از طریق FTP به وب سایت منتقل میکنین.

توجه : Apache نرم‌افزار بسیار قدرتمندی هستش و تنظیمات و امکانات بسیاری داره ، توی این پست مجال توضیح نیست و من به مرور زمان مطالب مرتبط با Apache مثل نحوه ساخت Virtual Host ،‌ تنظیمات مربوط به پیکربندی و … را توی پست های جداگانه خواهم نوشت.

PHP
پس از نصب Apache حالا باید PHP را نصب کنیم و این کار را با دستور زیر انجام میدیم :

sudo apt-get install php5 php5-mysql

بعد از نصب بر خلاف ویندوز که باید Apache را برای استفاده از PHP تنظیم میکردیم نیازی به هیچ تنظیماتی نیست و فقط کافیه سرویس Apache را با دستور زیر Reset کنید :

sudo service apache2 raload

حالا اگه یک فایل php در مسیر var/www/ بسازین و توش بنویسین ;()phpinfo و به نام phpinfo.php ذخیرش کنید و به آدرس http://localhost/phpinfo.php برین میتونید تمام تنظیمات و اطلاعات مرتبط با php را ببینین و مطمئن بشین همه چیز درست کار میکنه. آدرس فایل php.ini بارگزاری شده را هم میتونید ببینید و اگه نیاز هست تغییرات لازم را توش اعمال کنید. (فقط یادتون نره باید apache را rest کنید)

توجه : php دارای extension های زیادی هست مثل gd یا mcrypt یا pdo ،‌ ما در زمان نصب php5-mysql که یک extension برای ارتباط از طریق php با mysql هست را نصب کردیم. شما میتونید extension های دیگری را بر اساس نیازتون نصب کنین. برای پیدا کردن extension مورد نظر توی repo ها از دستور زیر استفاده کنید :

sudo apt-cache search php5-

MySQL
برای نصب پایگاه داده MySQL از دستور زیر استفاده میکنیم :

sudo apt-get install mysql-server

در فرآیند نصب ، گذرواژه ای که برای root در نظر میگیرین را حتماً به خاطر بسپارید تا در زمان استفاده مشکلی براتون پیش نیاد.

خوب بالاخره ما LAMP یا همون Linux, Apache, MySQL, PHP را نصب کردیم و میتونیم شروع به برنامه نویسی تحت وب کنیم. در پست بعدی مهاجرت به لینوکس ، به معرفی نرم‌افزار های جایگزین و مورد نیاز در برنامه نویسی وب و توسعه وب سایت‌ها می پردازم.