چگونه Apache را تنظیم کنیم تا هر کاربر برای خودش پوشه‌ی وب مجزا داشته باشد؟

(سیستم مورد بحث، Ubuntu 11 و Apache2 است. گرچه سایر سیستم ها هم مشابه اند.)

هنگامی که در لینوکس Apache و PHP را نصب می کنیم، فقط یک پوشه‌ی /var/www به وجود می آید که می توان در آن فایل های وب (فایل های php ) را قرار داد.

در مقاله‌ی قبلی توضیح دادم که چگونه با استفاده از VirtualHost ها چندین سایت متفاوت را میزبانی کنیم و برای هرکدام، پوشه های مختلفی را به عنوان پوشه ی root مشخص کنیم.

اما تصور کنید که می خواهیم برای هر کاربری در سیستم، یک پوشه ی وب اختصاص دهیم. به خصوص هنگامی که قصد داشته باشیم که سرور برای Web Hosting اشتراکی و تجاری تهیه کنیم، باید برای مشتریان، در سیستم User تعریف کنیم و برای هر کدام یک پوشه ی وب اختصاص دهیم.

اگر بخواهیم برای هر یک از مشتریان، یک VirtualHost ایجاد کنیم، ممکن است قدری کار سختی باشد!
یک روش بهتر این است که از ماژول UserDir در Apache استفاده کنیم.

به این ترتیب، می توان تنظیم کرد که هر کاربری، بتواند در پوشه ی Home خودش، یک پوشه به نام public_html یا htdocs ایجاد کند و فایل های وب اش را در آن جا قرار دهد. و دیگر نیازی به ساخت VirtualHost برای هر کاربر نخواهد بود.

آن گاه کاربران، برای این که به سایتشان دسترسی داشته باشند، می توانند آدرس IP ی سرور را در مرورگر وارد کنند و پس از آن نام کاربری خود را همراه با یک علامت ~ قرار دهند تا پوشه ی وب شان را ببینند.

مثلا کاربری به نام ahmad در سیستم، دارای پوشه ی home به آدرس /home/ahmad است و آدرس پوشه ی وب او هم به صورت زیر است:

/home/ahmad/public_html

و می تواند از طریق آدرس زیر، به فایل هایش در وب دسترسی داشته باشد:

http://12.34.56.78/~ahmad/

برای پیاده سازی این چنین سیستمی، اولین قدم این است که ماژول userdir را در Apache فعال کنیم. در Ubuntu دستور زیر را اجرا می کنیم:

sudo a2enmod userdir
sudo service apache2 restart
سپس کافی است دستور Userdir را در فایل پیکربندی Apache بگنجانیم. در اوبونتو، من فایل /etc/apache2/httpd.conf را انتخاب می کنم:

sudo vim /etc/apache2/httpd.conf
(این فایل، محلی است که در آن تنظیمات سفارشی آپاچی را قرار می دهیم)

دستور UserDir

دستور UserDir آدرس پوشه ای را مشخص می کند که فایل های کاربر باید در آن قرار گیرد. مقادیر مجاز برای این دستور عباتند از:

  1. آدرس یک پوشه و یا یک قالب مسیر (شامل wildcard) که آدرس پوشه ی کاربر را مشخص می کند.
    • ممکن است که مسیر مشخص شده، با یک اسلش / شروع شود و یک مسیر مطلق باشد. در این صورت، آدرس پوشه ی کاربر عبارت خواهد بود از آدرس فوق، بعلاوه نام کاربر.
    • ممکن است مسیر مشخص شده با / شروع شود و شامل یک علامت * (Wildcard) باشد. در این صورت، نام کاربر به جای * قرار خواهد گرفت.
    • ممکن است مسیر مشخص شده با / شروع نشود (و Wildcard هم نداشته باشد). در این صورت، آدرس پوشه ی کاربر عبارت خواهد بود از آدرس پوشه ی Home آن کاربر بعلاوه آدرس مشخص شده.
    • یک آدرس وب که با http:// شروع می شود. در این صورت، کاربر به آن آدرس redirect خواهد شد.
    • چند تا مورد از موارد بالا که با space از هم جدا شده اند. در این صورت، اگر یکی از آن ها موجود نبود، از بعدی استفاده می شود.
  2. کلمه ی disabled که مشخص می کند UserDir برای تمام کاربران غیر فعال است. به جز کاربرانی که توسط دستور enabled به وضوح فعال شده باشند. (در زیر مطالعه کنید.)
  3. کلمه ی disabled به همراه تعدادی نام کاربری. در این صورت، UserDir برای آن کاربران غیر فعال خواهد بود. حتی اگر توسط دستور enabled هم فعال شوند، قدرت disabled بیشتر از enabled است و UserDir برای آن کاربران غیر فعال خواهد بود.
  4. کلمه ی enabled به همراه تعدادی نام کاربری. در این صورت، UserDir برای آن کاربران فعال خواهد بود. حتی اگر که UserDir به صورت عمومی غیر فعال باشد. اما اگر UserDir توسط دستور disabled برای آن کاربر خاص، غیر فعال باشد، قدرت diabled بر enabled می چربد.

مثال ها:

فرض کنید که مرورگر، تقاضایی را به آدرس زیر ارسال کند:

http://www.foo.com/~bob/one/two.html

در این صورت اگر:

  • UserDir public_html
    آن گاه، آدرس URL فوق به صورت زیر ترجمه می‌شود:
    ~bob/public_html/one/two.html
    که در آن ~bob آدرس پوشه ی home کاربری به نام bob است.
  • UserDir /usr/web
    آن گاه، آدرس URL فوق به صورت زیر ترجمه می‌شود:
    /usr/web/bob/one/two.html
  • UserDir /home/*/www
    آن گاه، آدرس URL فوق به صورت زیر ترجمه می‌شود:
    /home/bob/www/one/two.html
    توجه کنید که * با نام کاربر جایگزین شد.
  • UserDir disabled
    UserDir enabled ahmad ali
    در این صورت، UserDir فقط برای کاربران ahmad و ali فعال خواهد بود.
  • UserDir enabled
    UserDir disabled root jro fish
    در این صورت UserDir برای همه فعال خواهد بود به جز root و jro و fish
  • UserDir http://www.foo.com/users
    در این صورت، کاربر به آدرس زیر هدایت می شود:
    http://www.foo.com/users/bob/one/two.html
  • UserDir http://www.foo.com/*/usr
    در این صورت، کاربر به آدرس زیر هدایت می شود:
    http://www.foo.com/bob/usr/one/two.html
    توجه کنید که هنوز هم * با نام کاربری جایگزین می شود.
  • UserDir http://www.foo.com/~*/
    در این صورت، کاربر به آدرس زیر هدایت می شود:
    http://www.foo.com/~bob/one/two.html

نکته ی امنیتی:
همواره توصیه می شود که UserDir برای root غیر فعال باشد.

UserDir disabled root

فعال کردن پوشه ی CGI برای کاربران:

کافی است از ساختار زیر استفاده کنیم. برای مثال می خواهیم پوشه ی cgi-bin برای هر کاربر محل اجرای CGI باشد:

<Directory /home/*/public_html/cgi-bin/>
   Options ExecCGI
   SetHandler cgi-script
</Directory>
فعال کردن PHP برای کاربران:

به طور پیش فرض، PHP در پوشه های UserDir غیر فعال است. دلیل آن هم این است که در فایل زیر، غیر فعال شده است:

/etc/apache2/mods-enabled/php5.conf

برای فعال کردن PHP در UserDir ها، فایل فوق را ویرایش کنید و خطوط زیر را پیدا کرده و پشت آن ها # قرار دهید:

<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
         php_admin_value engine Off
    </Directory>
</IfModule>
سپس Apache را ریستارت کنید:

sudo service apache2 reload


منابع:

http://httpd.apache.org/docs/2.0/howto/public_html.html
http://httpd.apache.org/docs/2.0/mod/mod_userdir.html

نظرات شما

قسمت نظرات با استفاده از سرویس دیسکاس پیاده سازی شده است. متاسفانه این سرویس از داخل ایران قابل دسترس نیست. لطفا از آی پی خارجی استفاده کنید.