پیکربندی و استفاده از Varnish™ در Apache برای Ruby
در این مقاله:
نکته: ما در حال تغییر ساختار فایل و پیکربندی بسیاری از استکهای بیتنامی هستیم. در نتیجهی این تغییرات، مسیر فایلهایی که در این آموزش به آنها اشاره شده ممکن است تغییر کند که این موضوع هم بستگی دارد که استک بیتنامی شما از پکیجهای سیستمی نیتیو لینوکس استفاده میکند (رویکرد A) یا نسخهای self-contained است (رویکرد B). برای تشخیص نوع استکتان و انتخاب رویکرد متناسب، دستور زیر را اجرا کنید:
test ! -f "/opt/bitnami/common/bin/openssl" && echo "Approach A: Using system packages." || echo "Approach B: Self-contained installation."
خروجی این دستور نشان میدهد که اپلیکیشن شما از کدام رویکرد (A یا B) استفاده میکند و به شما کمک میکند که در این راهنما مسیر، پیکربندی و دستورات متناسب با آن را انتخاب کنید. برای اطلاعات بیشتر راجع به این تغییرات، به بخش سوالات رایج مراجعه کنید.
Varnish™ یک وب اپلیکیشن شتابدهنده است که جلوی هر سرور HTTP نصب و پیکربندی میشود و ذخیرهسازی محتوا در حافظهی نهان را بر عهده میگیرد.Varnish™ سریع است و سرعت تحویل را بسته به معماری بین 300 تا 1000 برابر افزایش میدهد.
Varnish™ نیاز به یک کامپایلر فعال (مانند gcc) دارد که فایل پیکربندیاش را کامپایل کند. پس از کامپایل این اپلیکیشن به صورت پویا به سرور متصل میشود.
فعالسازی Varnish™
Varnish™ به صورت پیشفرض غیرفعال است، پس نمیتوان از طریق اسکریپت کنترلی آن را روشن کرد. برای فعالسازی آن مراحل زیر را طی کنید:
- برای فعالسازی سرویس Varnish™ بسته به نوع سیستمتان، یکی از دستورات زیر را اجرا کنید:
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند):
sudo mv /etc/monit/conf.d/varnish.conf.disabled /etc/monit/conf.d/varnish.conf
sudo gonit reload
-
- رویکرد B (اپلیکیشنهای Self-contained):
sudo mv /opt/bitnami/varnish/scripts/ctl.sh.disabled /opt/bitnami/varnish/scripts/ctl.sh
sudo /opt/bitnami/ctlscript.sh start varnish
- از آنجا که در حال حاضر بیتنامی فعال بودن همزمان Varnish™ و PageSpeed را پشتیبانی نمیکند، مطمئن شوید که PageSpeed غیرفعال شده باشد. برای اطلاعات بیشتر راجع به این موضوع این راهنما را مطالعه کنید.
آغاز به کار Varnish™
به صورت پیشفرض Varnish™ به صورتی پیکربندی شده تا پورت TCP 81 استفاده کند. برای راهاندازی سرویس Varnish™ مراحل زیر را طی کنید:
- دستورات زیر را در کنسول سرور وارد کنید:
sudo /opt/bitnami/ctlscript.sh start varnish
- مطمئن شوید که آپاچی فعال باشد:
sudo /opt/bitnami/ctlscript.sh start apache
حال باید روی هر دو پورت 80 و 81، بهترتیب برای آپاچی و Varnish™ به صفحهی اصلی دسترسی داشته باشید.
- اگر از طریق پورت 80 به سرور متصل شوید گویی Varnish™ اصلن فعال نیست و تمامی اطلاعات از خود سرور دریافت میشود.
- اگر از طریق پورت 81 متصل شوید، Varnish™ مانند یک پروکسی معکوس عمل میکند و محتوایی را نمایش میدهد که در حافظهی نهان ذخیره کرده است و درخواست محتوای ذخیره نشده در حافظهی نهان را به آپاچی میدهد.
بررسی وضعیت Varnish™
با دستور varnishlog میتوانید ببینید که پشت پرده چه اتفاقاتی در جریان است. برای اینکه مشخص کنید دقیقن میخواهید کدام فرآیند Varnish™ را بررسی کنید، سراغ دایرکتوری در حال کار Varnish™ بروید که به صورت پیشفرض در مسیر /opt/bitnami/varnish/var/varnish قرار دارد.
0 CLI - Rd ping
0 CLI - Wr 200 19 PONG 1340840690 1.0
0 CLI - Rd ping
0 CLI - Wr 200 19 PONG 1340840693 1.0
0 CLI - Rd ping
0 CLI - Wr 200 19 PONG 1340840696 1.0
اگر از طریق پورت پیکربندی شده برای Varnish™ از سرور بازدید کنید (که در مثال ما پورت 81 است)، خروجیهای جالبتری مشاهده خواهید کرد:
15 Hash c /favicon.ico
15 Hash c 75.101.208.108
15 VCL_return c hash
15 VCL_call c pass pass
15 Backend c 14 default default
15 TTL c 1976586397 RFC 120 -1 -1 1340840847 0 1340840847 0 0
15 VCL_call c fetch
15 TTL c 1976586397 VCL 120 -1 -1 1340840847 -0
....
15 TxResponse c OK
15 TxHeader c Server: Apache
15 TxHeader c X-Powered-By: PHP/5.3.13
15 TxHeader c Content-Type: image/vnd.microsoft.icon
15 TxHeader c Content-Length: 0
15 TxHeader c Accept-Ranges: bytes
15 TxHeader c Date: Wed, 27 Jun 2012 23:47:27 GMT
15 TxHeader c X-Varnish: 1976586397
برای اینکه دقیقتر متوجه اتفاقاتِ در جریان شوید، از دستور varnishstat استفاده کنید:
AVG_1000 | AVG_100 | AVG_10 | AVERAGE | CHANGE | CURRENT | Name |
0+00:07:02 | MGT.uptime | |||||
0+00:07:03 | MAIN.uptime | |||||
0.01 | 0.01 | 0.03 | 0.02 | 0.00 | 8 | MAIN.sess_conn |
0.01 | 0.01 | 0.03 | 0.47 | 0.00 | 197 | MAIN.client_req |
0.01 | 0.01 | 0.03 | 0.02 | 0.00 | 7 | MAIN.cache_miss |
این دستور هم اطلاعات بیشتری را در اختیارتان قرار میدهد و هم با بررسی MAIN.backend_reuse (تناوب دفعاتی که Varnish™ محتواها را در حافظهی نهانش مییابد) و MAIN.cache_miss (دفعاتی که Varnish™ با شکست روبهرو شده و مجبور به برقراری ارتباط با وب سرور است) متوجه میشوید که Varnish™ چطور کار میکند.
پس از اینکه مدتی سایت را مرور کردید، ممکن است خروجیهای شما به شکل زیر در بیاید:
AVG_1000 | AVG_100 | AVG_10 | AVERAGE | CHANGE | CURRENT | Name |
0+00:19:34 | MGT.uptime | |||||
0+00:19:35 | MAIN.uptime | |||||
0.03 | 0.08 | 0.00 | 0.03 | 0.00 | 26 | MAIN.sess_conn |
0.65 | 1.77 | 0.04 | 0.63 | 0.00 | 593 | MAIN.client_req |
0.03 | 0.03 | 0.00 | 0.01 | 0.00 | 6 | MAIN.cache_hit |
0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 3 | MAIN.cache_hit_grace |
0.01 | 0.02 | 0.00 | 0.01 | 0.00 | 12 | MAIN.cache_miss |
0.02 | 0.05 | 0.00 | 0.02 | 0.00 | 21 | MAIN.backend_conn |
0.62 | 1.70 | 0.04 | 0.60 | 0.00 | 569 | MAIN.backend_reuse |
غیرفعال کردن Varnish™
مهم: پیش از غیرفعال کردن Varnish™ اطمینان حاصل کنید که تمامی سرویسها متوقف شده باشند و همانطور که در راهنمای Varnish™ آمده، آپاچی روی پورت 80 در حال کار باشد.
در برخی موارد لازم است که Varnish™ غیرفعال شود. مثلن زمانی که میخواهید هدایت اجباری HTTPS از طریق آپاچی را استفاده کنید (همچنین میتوانید Varnish™ را با SSL پیکربندی کنید). برای غیرفعال کردن Varnish™ این مراحل را دنبال کنید:
- سرویس Varnish™ را متوقف کنید:
sudo /opt/bitnami/ctlscript.sh stop varnish
- سرویس Varnish™ را غیرفعال کنید. بسته به نوع سیستمتان، یکی از دستورات زیر را اجرا کنید:
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند):
sudo mv /etc/monit/conf.d/varnish.conf /etc/monit/conf.d/varnish.conf.disabled
sudo gonit reload
-
- رویکرد B (اپلیکیشنهای Self-contained):
sudo mv /opt/bitnami/varnish/scripts/ctl.sh /opt/bitnami/varnish/scripts/ctl.sh.disabled
sudo /opt/bitnami/ctlscript.sh start varnish
- آپاچی را دوباره راهاندازی کنید:
sudo /opt/bitnami/ctlscript.sh start apache
استفاده از Varnish™ با SSL
Varnish™ با HTTPS سازگاری ندارد و باید جلوی آن از یک ترمیناتور SSL استفاده کنید. با این حال میتوانید آپاچی را بهگونهای پیکربندی کنید که تمامی درخواستهای HTTPS را به Varnish™ منتقل کند. مراحل زیر را دنبال کنید:
- Varnish™ را فعال و اجرا کنید.
- فایل پیکربندی هاست مجازی Apache HTTPS را در یک ویرایشگر باز کنید. بسته به نوع اپلیکیشنتان، یکی از فایلهای زیر را ویرایش کنید:
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند): /opt/bitnami/apache2/conf/bitnami/bitnami-ssl.conf
- رویکرد B (اپلیکیشنهای Self-contained): /opt/bitnami/apache2/conf/bitnami/bitnami.conf
- هاست مجازی Apache HTTPS را که به صورت پیشفرض از پورت 443 استفاده میکند، اصلاح کنید و خطوط زیر را به آن اضافه کنید تا تمامی درخواستهایش را به Varnish™ منتقل کند.
<VirtualHost _default_:443>
...
ProxyPreserveHost On
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
ProxyPass "/" "http://127.0.0.1:81/"
ProxyPassReverse "/" "http://127.0.0.1:81/"
...
# Bitnami applications installed with a prefix URL (default)
# Include "/opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf"
</VirtualHost>
- اپلیکیشن را بهگونهای پیکربندی کنید که از نام دامنهی صحیح استفاده کند. مراحل انجام این کار برای هر اپلیکیشنی متفاوت است. برای مثال اگر از وردپرس استفاده میکنید لازم است که این مراحل را طی کنید.
- آپاچی را دوباره راهاندازی کنید:
sudo /opt/bitnami/ctlscript.sh restart apache
شخصیسازی Varnish™
Varnish™ با یک فایل پیکربندی پیشفرض نصب میشود تا وب اپلیکیشن را در حافظهی نهان ذخیره کند. استفاده از این فایل پیکربندی در عین حالی که عملکرد را بهبود میبخشد، ممکن است در مواردی باعث شود که برخی از محتواها به خوبی در Varnish™ تازهسازی نشوند. در نتیجه کاربر نسخهی قدیمی و منسوخشدهی سایت شما را مشاهده میکند.
راه حل این مشکل استفاده از فایل پیکربندی شخصیسازیشدهی VCL است. چندین منبع در اینترنت وجود دارد که فایلهای پیکربندی شخصیسازیشده برای اپلیکیشنهای مختلف ارائه میدهند. یکی از بهترینِ این منابع صفحهی مثال Varnish™ است.
این بخش دربارهی نحوهی تغییر فایل پیکربندی پیشفرض به یک فایل مخصوص وردپرس میپردازد. مراحل زیر را دنبال کنید:
- فایل اصلی را از اینجا دریافت کنید.
- فایل نیاز به تغییراتی دارد تا روی پورت سرور آپاچی شما ثبت شود. این پورت را میتوانید در فایل پیکربندی آپاچی (/opt/bitnami/apache2/conf/httpd.conf) و در بخش Listen پیدا کنید:
...
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
...
یا میتوانید در پنجرهی فرمان این دستور را اجرا کنید:
egrep '^Listen ' /opt/bitnami/apache2/conf/httpd.conf
Listen 80
این مقدار (80) را در نظر داشته باشید و با توجه به آن فایل دانلودی را ویرایش و بخش مربوط به شمارهی پورت را بهروز کنید:
backend default {
.host = "127.0.0.1";
.port = "81";
}
نکته: برای استکهای بیتنامی Varnish™ مانند آپاچی روی برخی سرورها نصب است. در نتیجه هاست را میتوان از طریق 127.0.0.1 پیکربندی کرد. همچنین میتوانید از Varnish™ برای ذخیرهسازی یک سرور ریموت در حاظهی نهان استفاده کنید. برای این کار به آیپی آدرس هاست نیاز دارید.
- فایل را در دایرکتوری Varnish™ کپی کنید:
cp /path/to/the/wordpress.vcl /opt/bitnami/varnish/etc/varnish/
- Varnish™ را متوقف کنید:
sudo /opt/bitnami/ctlscript.sh stop varnish
- Varnish™ را بهگونهای پیکربندی کنید تا فایل درست را بارگذاری کند. با توجه به نوع سیستمتان، مراحل زیر را دنبال کنید:
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند):
- فایل /opt/bitnami/scripts/varnish-env.sh را ویرایش و خطوط زیر را به انتهای آن اضافه کنید:
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند):
export VARNISH_CONF_FILE="/opt/bitnami/varnish/etc/varnish/wordpress.vcl"
-
- رویکرد B (اپلیکیشنهای Self-contained):
- فایل /opt/bitnami/varnish/scripts/ctl.sh را ویرایش کنید و مقدار متغیر VARNISH_CONFIG_FILE را تغییر دهید تا به فایل پیکربندی جدید اشاره داشته باشد:
- رویکرد B (اپلیکیشنهای Self-contained):
#! /bin/sh
...
VARNISH_CONFIG_FILE=/opt/bitnami/varnish/etc/varnish/wordpress.vcl
...
- Varnish™ (و در صورت نیاز آپاچی) را دوباره راهاندازی کنید:
sudo /opt/bitnami/ctlscript.sh start varnish
sudo /opt/bitnami/ctlscript.sh start apache
مهم: اگر ماژول PageSpeed فعال باشد، Varnish™ نمیتواند محتوا را در حافظهی نهان ذخیره کند. برای آشنایی با نحوهی غیرفعال کردن این ماژول، این مطلب را مطالعه کنید.
تغییر پورتهای پیشفرض Varnish™ و آپاچی
پس از اینکه درست کار کردن همهچیز را بررسی کردید، شاید بخواهید پورت Varnish™ را به پورتی استاندارد (معمولن پورت 80) تغییر دهید. اگر این پورت در زمان نصب آزاد بوده باشد، قاعدتن باید آپاچی آن را اشغال کرده باشد.
مراحل زیر را طی کنید:
- آپاچی و Varnish™ را متوقف کنید:
sudo /opt/bitnami/ctlscript.sh stop apache
sudo /opt/bitnami/ctlscript.sh stop varnish
- برای پیکربندی پورتها ابتدا باید پورت آپاچی و سپس پورت Varnish™ را تغییر دهید. با ویرایش بخش Listen در فایل پیکربندی آپاچی (/opt/bitnami/apache2/conf/httpd.conf)، آپاچی را به پورتی دیگر منتقل کنید. خطوط زیر را در فایل پیدا کنید:
...
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
...
و آنها را به گونهای تغییر دهید که آپاچی به پورتی دیگر گوش کند:
...
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 81
...
- پیکربندی اپلیکیشنتان را برای آپاچی بهروز کنید. برای مثال اگر اپلیکیشنهای شما برای هاست مجازی پیکربندی شده است، پورت آپاچی را در فایل پیکربندی آپاچی (/opt/bitnami/apache2/conf/httpd.conf)، فایل /opt/bitnami/apache2/conf/bitnami/bitnami.conf و تمام هاستهای مجازی مخصوص اپلیکیشن تغییر دهید. فایل هاستهای مجازی با توجه به نوع اپلیکیشنتان در یکی از محلهای زیر قرار دارد:
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند):
- تمام فایلهای هاست مجازی داخل دایرکتوری /opt/bitnami/apache2/conf/vhosts را ویرایش کنید:
- رویکرد B (اپلیکیشنهای Self-contained):
- برای اینکه بفهمید چه اپلیکیشنهایی در هاستهای مجازی در حال اجرا هستند، فایل /opt/bitnami/apache2/conf/bitnami/bitnami-apps-vhosts.conf را بررسی کنید. این فایل شامل لیستی از تمامی اپلیکیشنهایی است که نیاز به بهروزرسانی دارند.
- پس از آن فایل /opt/bitnami/apps/APP-NAME/conf/httpd-vhosts.conf را ویرایش کنید.
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند):
- Varnish™ را بهگونهای پیکربندی کنید که از پورت قدیمی آپاچی (80) استفاده کند و در فایل پیکربندی پورت جدید (81) را برای آپاچی در نظر بگیرید.
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند):
- فایل /opt/bitnami/scripts/varnish-env.sh را ویرایش و خطوط زیر را به انتهای آن اضافه کنید:
- رویکرد A (اپلیکیشنهایی که از پکیجهای سیستمی لینوکس استفاده میکنند):
export VARNISH_CONF_FILE="/opt/bitnami/varnish/etc/varnish/default.vcl"
export VARNISH_PORT_NUMBER="80"
-
- رویکرد B (اپلیکیشنهای Self-contained):
- فایل /opt/bitnami/varnish/scripts/ctl.sh را ویرایش و بهگونهای بهروز کنید تا به شکل زیر دربیاید:
- رویکرد B (اپلیکیشنهای Self-contained):
#! /bin/sh
...
VARNISH_PORT=80
...
VARNISH_CONFIG_FILE=/opt/bitnami/varnish/etc/varnish/default.vcl
...
- فایل پیکربندی Varnish™ که در مسیر /opt/bitnami/varnish/etc/varnish/default.vcl قرار دارد، شامل پورتی است که آپاچی به آن گوش میدهد. آن را با پورت جدید آپاچی (81) بهروزرسانی کنید:
backend default {
.host = "127.0.0.1";
.port = "81";
}
- سرورها را دوباره راهاندازی کنید:
sudo /opt/bitnami/ctlscript.sh restart varnish
اکنون آپاچی بدون حافظهی نهان باید روی پورت 81 و Varnish™ در نقش پراکسی معکوس روی پورت 80 در دسترس باشد.
نکته: در هر زمان میتوانید با دنبال کردن این دستورالعمل، Varnish™ را غیرفعال کنید.
مسدود کردن آدرسهایی خاص از ذخیره شدن در حافظهی نهان توسط Varnish™
توصیه میشود که نگذارید phpMyAdmin، phpPgAdmin و/یا server-status در حافظهی نهان ذخیره و عمومی شوند. برای این کار خطوط زیر را به انتهای فایل پیکربندی پیشفرض Varnish™ (در مسیر /opt/bitnami/varnish/etc/varnish/default.vcl) یا به فایل پیکربندی Varnish™ برای اپلیکیشنتان اضافه کنید:
sub vcl_recv {
if (req.url ~ "^/phpmyadmin/.*$" || req.url ~ "^/phppgadmin/.*$" || req.url ~ "^/server-status.*$") {
return (synth(403, "For security reasons, this URL is only accessible using localhost (127.0.0.1) as the hostname"));
}
}