نصب Nginx روی اوبونتو و ساخت Server Block

برای نصب Nginx روی اوبونتو کافی است بسته nginx را با apt نصب کنید، در فایروال پورت‌های ۸۰ و ۴۴۳ را باز کنید و بعد برای هر سایت یک Server Block بسازید. Server Block فایل کانفیگی است که به Nginx می‌گوید درخواست‌های هر دامنه را از کدام پوشه سرو کند. نصب به‌تنهایی فقط صفحه خوش‌آمدگویی پیش‌فرض را نشان می‌دهد؛ اتصال دامنه و SSL در مراحل بعد انجام می‌شود.

دستورها برای Ubuntu 22.04 و 24.04 نوشته شده‌اند و روی Debian هم تقریباً همین‌طورند. تفاوت AlmaLinux و Rocky در بخش جداگانه‌ای آمده است. اگر دنبال تنظیمات پیشرفته‌تر مثل کش و Load Balancing هستید، آن‌ها را در وب سرور لینوکس: نصب و پیکربندی پیشرفته می‌بینید.

پیش از نصب

  • دامنه باید با رکورد A به IP سرور اشاره کند. شرط دریافت گواهی SSL هم همین است.
  • با کاربری که دسترسی sudo دارد وارد شوید و ترجیحاً از ورود با کلید استفاده کنید؛ روشش در آموزش SSH Key آمده است.
  • اگر Apache از قبل روی سرور هست و پورت ۸۰ را گرفته، Nginx بالا نمی‌آید. با sudo ss -ltnp | grep ':80' ببینید چه سرویسی روی ۸۰ گوش می‌دهد.

مرحله اول: نصب Nginx

sudo apt update
sudo apt install nginx

بعد از نصب، سرویس خودکار روشن می‌شود. وضعیت و نسخه را ببینید:

systemctl status nginx
nginx -v

بسته‌ای که با apt نصب می‌شود نسخه پایدار توزیع است و وصله‌های امنیتی را از مخزن اوبونتو می‌گیرد. اگر به نسخه جدیدتر نیاز دارید، مخزن رسمی nginx.org را اضافه کنید، ولی برای بیشتر سایت‌ها نسخه اوبونتو کافی است.

مرحله دوم: باز کردن پورت‌ها در فایروال

اگر UFW فعال است، پروفایل Nginx Full هر دو پورت ۸۰ و ۴۴۳ را باز می‌کند. برای اینکه ورود SSH قطع نشود، قبل از فعال کردن UFW حتماً پورت SSH را مجاز کنید:

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw status

بعد آدرس IP سرور را در مرورگر باز کنید. صفحه Welcome to nginx یعنی نصب درست انجام شده است.

ساختار فایل‌های Nginx

مسیرکاربرد
/etc/nginx/nginx.confکانفیگ اصلی؛ معمولاً دست نمی‌خورد
/etc/nginx/sites-available/فایل کانفیگ هر سایت
/etc/nginx/sites-enabled/لینک نمادین به کانفیگ‌های فعال
/var/www/محل پیشنهادی فایل‌های سایت
/var/log/nginx/access.log و error.logلاگ‌های پیش‌فرض

این ساختار sites-available و sites-enabled مخصوص Debian و Ubuntu است. سایت وقتی فعال می‌شود که برایش لینکی در sites-enabled ساخته باشید.

مرحله سوم: ساخت Server Block برای دامنه

فرض کنید دامنه example.com است. اول پوشه سایت و یک صفحه آزمایشی بسازید:

sudo mkdir -p /var/www/example.com/html
echo '<h1>example.com works</h1>' | sudo tee /var/www/example.com/html/index.html
sudo chown -R www-data:www-data /var/www/example.com

بعد فایل /etc/nginx/sites-available/example.com را با این محتوا بسازید:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

حالا سایت را فعال کنید، کانفیگ را تست کنید و Nginx را reload کنید:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

دستور nginx -t پیش از اعمال هر تغییر خطاهای کانفیگ را نشان می‌دهد و باید همیشه قبل از reload اجرا شود. اگر خطا ندارد، reload بدون قطع اتصال‌های جاری کانفیگ جدید را برمی‌دارد، برخلاف restart که سرویس را کامل می‌بندد.

مرحله چهارم: فعال کردن HTTPS

گواهی رایگان Let’s Encrypt را با Certbot می‌گیرید و Nginx به‌طور خودکار پیکربندی می‌شود:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot بلوک 443 را به فایل اضافه می‌کند و تمدید خودکار را هم با یک تایمر systemd برقرار می‌کند. مراحل کامل و حالت‌های دیگر، مثل Wildcard، در نصب SSL رایگان آمده است.

اضافه کردن PHP با PHP-FPM

برای سایت‌های PHP، مثل وردپرس، باید PHP-FPM را نصب و در Server Block معرفی کنید:

sudo apt install php-fpm php-mysql

سپس داخل بلوک server این location را اضافه کنید. شماره نسخه PHP را با نسخه‌ای که نصب شده است عوض کنید؛ نسخه را با php -v می‌بینید:

index index.php index.html;

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

اگر بعداً با خطای 502 مواجه شدید، بیشتر وقت‌ها مسیر سوکت اشتباه است یا سرویس php-fpm خاموش است؛ عیب‌یابی کامل آن در خطای 502 Bad Gateway آمده است.

نصب Nginx در AlmaLinux و Rocky

نصب با dnf انجام می‌شود و ساختار فایل‌ها فرق دارد: سایت‌ها در /etc/nginx/conf.d/ با پسوند conf تعریف می‌شوند و sites-available وجود ندارد:

sudo dnf install nginx
sudo systemctl enable --now nginx
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload

دو نکته در این توزیع‌ها زیاد دردسر می‌سازد. کاربر Nginx به‌جای www-data، کاربری به نام nginx است. و SELinux به‌طور پیش‌فرض اجازه نمی‌دهد Nginx به شبکه وصل شود؛ اگر از proxy_pass استفاده می‌کنید باید setsebool -P httpd_can_network_connect 1 را اجرا کنید.

دستورهای کاربردی Nginx

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart nginx
sudo nginx -T | less
sudo tail -f /var/log/nginx/error.log

دستور nginx -T کانفیگ کامل نهایی را با همه include‌ها چاپ می‌کند و برای پیدا کردن اینکه یک تنظیم از کدام فایل می‌آید مفید است.

خطاهای رایج بعد از نصب

نشانهعلت و راه حل
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)سرویس دیگری، معمولاً Apache، پورت ۸۰ را گرفته؛ آن را متوقف یا پورت را عوض کنید
صفحه Welcome to nginx بعد از ساخت سایت هم باز می‌شودلینک سایت در sites-enabled نیست یا server_name با دامنه نمی‌خواند
403 Forbiddenدسترسی پوشه یا فایل‌ها برای www-data نیست، یا فایل index وجود ندارد
404 برای همه آدرس‌هامسیر root اشتباه است یا فایل‌ها در جای دیگری هستند
conflicting server name در nginx -tدو بلوک برای یک دامنه تعریف شده است

اگر به لایه‌های دیگر امنیت هم نیاز دارید، پس از نصب مراحل چک لیست امنیت سرور لینوکس را هم انجام دهید. و برای استفاده از Nginx به‌عنوان واسطه جلوی برنامه‌ها، Reverse Proxy چیست را بخوانید.

سوالات متداول

Nginx بهتر است یا Apache؟

هر دو وب‌سرور پایدارند. Nginx برای سرو فایل‌های ثابت، تعداد اتصال زیاد و نقش Reverse Proxy معمولاً مصرف حافظه کمتری دارد. Apache از فایل .htaccess پشتیبانی می‌کند که در هاست‌های اشتراکی و بعضی نرم‌افزارها لازم است. Nginx آن را نمی‌شناسد و قوانین باید در کانفیگ سرور نوشته شوند.

تفاوت reload و restart در Nginx چیست؟

reload کانفیگ جدید را بدون قطع اتصال‌های جاری می‌خواند، ولی restart سرویس را کامل متوقف و دوباره روشن می‌کند. بعد از nginx -t موفق، معمولاً reload کافی است.

چند سایت را می‌شود روی یک Nginx اجرا کرد؟

بله. برای هر دامنه یک Server Block با server_name خودش بسازید. Nginx بر اساس هدر Host درخواست، بلوک مناسب را انتخاب می‌کند.

برای وردپرس Nginx را چطور تنظیم کنم؟

با PHP-FPM و بلوک location برای فایل‌های PHP که بالا آمد، و تغییر try_files به try_files $uri $uri/ /index.php?$args; تا لینک‌های یکتای وردپرس کار کنند. انتقال سایت وردپرس به سرور جدید در انتقال سایت وردپرس به هاست جدید توضیح داده شده است.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *