## راهنمای کامل نصب **Varnish** (شتابدهنده HTTP) و انجام تست بار با **Apache Benchmark (ab)**
Varnish یک لایه کش (HTTP accelerator) است که با قرار گرفتن بین کاربر و وبسرور (مثلاً Apache یا Nginx) درخواستهای تکراری را از حافظه پاسخ میدهد و فشار روی سرور اصلی را کم میکند. در این آموزش یاد میگیرید:
1. **نصب Varnish** روی توزیعهای محبوب لینوکس
2. پیکربندی Varnish برای کار با Apache
3. اجرای **تست بار** پیش و پس از فعالسازی Varnish با ابزار `ab`
4. تفسیر خروجیها و نکات تکمیلی
---
### ۱) پیشنیازها
| مورد | شرح |
| ---------- | ------------------------------------------------------------------------------------ |
| سیستمعامل | Ubuntu 20.04 یا جدیدتر / Debian 12 / RHEL 8 / AlmaLinux 9 (دستورها مشابه CentOS 7/8) |
| وبسرور | Apache (نسخهٔ اخیر) روی همین ماشین |
| دسترسی | کاربر sudo یا root |
| ابزار تست | بستهٔ `apache2-utils` (دربردارندهٔ ab) |
---
## ۲) نصب Varnish
#### Ubuntu / Debian
```bash
sudo apt update
sudo apt install varnish -y
```
> بستهٔ پیشفرض مخزن Ubuntu 22.04 معمولاً Varnish 7.x است.
#### RHEL / AlmaLinux / CentOS
```bash
sudo dnf install epel-release -y # در CentOS/AlmaLinux
sudo dnf install varnish -y
```
---
## ۳) تنظیم پورتها و پیکربندی اولیه
### ۳.۱ تغییر پورت Apache
بهطور پیشفرض هر دو روی 80 گوش میدهند؛ پس پورت Apache را روی **8080** میگذاریم تا Varnish پورت 80 را تصاحب کند.
```bash
# Ubuntu/Debian
sudo nano /etc/apache2/ports.conf
# RHEL/CentOS
sudo nano /etc/httpd/conf/httpd.conf
```
```apache
Listen 8080
```
فایل VirtualHost پیشفرض را هم از 80 به 8080 تغییر دهید (مثلاً `/etc/apache2/sites-available/000-default.conf`).
سپس وبسرور را ریاستارت کنید:
```bash
sudo systemctl restart apache2 # یا httpd
```
### ۳.۲ تنظیم Varnish برای لیستن روی 80
فایل سرویس Systemd را ویرایش کنید:
```bash
sudo systemctl edit --full varnish
```
پارامتر `ExecStart` معمولاً چنین است:
```ini
ExecStart=/usr/sbin/varnishd -j unix,user=vcache \
-F -a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-s malloc,512m
```
> عدد `512m` حافظهٔ کش است؛ بر اساس رم سرور تنظیم کنید.
### ۳.3 تعریف بکاند Apache در VCL
```bash
sudo nano /etc/varnish/default.vcl
```
```vcl
vcl 4.1;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
# زمان پیشفرض نگهداری آبجکت در کش
sub vcl_backend_response {
set beresp.ttl = 1h;
}
```
---
## ۴) راهاندازی و فعالسازی
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now varnish
```
بررسی وضعیت:
```bash
sudo systemctl status varnish
```
---
## ۵) تست سریع با curl
```bash
curl -I http://localhost
```
* هدر `Via: 1.1 varnish` نشان میدهد پاسخ از Varnish عبور کرده است.
* درخواست دوم باید هدر `Age:` بزرگتر از صفر داشته باشد (کش شده).
---
## ۶) تست بار با Apache Benchmark
### ۶.۱ نصب ab
```bash
# Ubuntu/Debian
sudo apt install apache2-utils -y
# RHEL/CentOS
sudo dnf install httpd-tools -y
```
### ۶.2 سناریوی مقایسه
| حالت | URL تست | توضیح |
| ------- | ------------------------ | ------------------ |
| بدون کش | `http://localhost:8080/` | مستقیماً به Apache |
| با کش | `http://localhost/` | عبور از Varnish |
#### ۱) تست baseline بدون کش
```bash
ab -n 10000 -c 200 http://localhost:8080/
```
* **`-n 10000`** تعداد کل درخواستها
* **`-c 200`** تعداد کانکشن همزمان
#### ۲) تست با کش Varnish
```bash
ab -n 10000 -c 200 http://localhost/
```
### ۶.۳ تفسیر نتایج کلیدی
| شاخص | معنی | انتظار پس از استفاده از Varnish |
| ------------------- | ------------------------------ | -------------------------------- |
| Requests per second | تعداد درخواست در ثانیه | افزایش محسوس |
| Time per request | زمان متوسط پاسخ | کاهش قابل توجه |
| Transfer rate | میزان دادهٔ منتقلشده بر ثانیه | اندکی بالاتر (به دلیل هدر اضافی) |
| 50% / 95% / 99% | صدکهای تاخیر | کاهش چشمگیر تاخیر |
> اگر اختلاف کم است، دلایل محتمل: **هیت ریت پایین کش**، کوچک بودن آبجکتها، یا محدود بودن CPU/شبکه.
---
## ۷) ابزارهای پایش Varnish
| دستور | کاربرد |
| ------------- | ---------------------------------------- |
| `varnishstat` | آمار زندهٔ هیت/میتس، بایت ورودی/خروجی |
| `varnishlog` | لاگ در سطح درخواست؛ برای دیباگ قوانین کش |
| `varnishadm` | اجرای فرمان روی Instance؛ مثل purge دستی |
---
## ۸) نکات بهینهسازی و امنیت
1. **حافظه کش** (`-s malloc,1G`) را متناسب با ترافیک افزایش دهید.
2. با دستور `ban` یا `purge` صفحات حساس را از کش خارج کنید.
3. برای جلوگیری از دور زدن کش، فایروال را طوری تنظیم کنید که پورت 8080 فقط از لوکالهاس در دسترس باشد.
4. اگر روی HTTPS کار میکنید، میتوانید Nginx را بهعنوان ترمیناتور TLS جلوی Varnish بگذارید یا از Varnish Plus استفاده کنید.
---
## ۹) نتیجهگیری
* با **نصب و پیکربندی صحیح Varnish** میتوانید پاسخهای تکراری را مستقیماً از حافظه سرو کنید و بار CPU/دییسک سرور Apache را بهطور محسوسی کاهش دهید.
* **Apache Benchmark** ابزار سادهای است برای کمّیسازی این بهبود؛ همیشه قبل و بعد از هر تغییر، عددها را مقایسه کنید.
* برای محیط تولیدی، پایش مداوم `varnishstat` و تنظیم TTL، اندازه کش، و قوانین purge حیاتی است.