Nginx

مقدمه

Nginx یه وب‌سرور سریع و سبکه که برای سرو کردن وبسایت‌های استاتیک و ریورس پراکسی و … استفاده میشه. البته کاربردهای جالب دیگه‌ای مثل Load Balancing و Rate Limiting هم داره. تو این مقاله ما یه سری کلیات به علاوه کاربردهای nginx و استفاده از FastCGI و SSL رو بررسی می‌کنیم. با این مقاله درک بهتری از کلیات Nginx پیدا می‌کنید.

نصب Nginx در Ubuntu

اینم نحوه نصبش در اوبونتو

sudo apt update
sudo apt install nginx

به صورت پیش‌فرض وقتی نصب تموم بشه، پورت ۸۰ و ۴۴۳ رو سرورتون باز میشه و اگه تو مرورگر IP‌سرورتونو بزنید و یا اگه تو لوکال باشید و تو مرورگر localhost رو بزنید، صفحه زیر رو میبینید.


شاید لازم باشه دسترسی Nginx رو تو فایروال اوکی کنید. البته من تا حالا مجبور نشدم اینکارو بکنم. ولی به هر حال:

sudo ufw allow 'Nginx HTTP'

با دستور زیر میتونید وضعیت فعال بودن Nginx رو ببینید:

systemctl status nginx

اگه چیزی شبیه به کد زیر دیدید یعنی Nginx فعاله:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-08-29 06:52:46 UTC; 39min ago
       Docs: man:nginx(8)
   Main PID: 9919 (nginx)
      Tasks: 2 (limit: 2327)
     Memory: 2.9M
        CPU: 50ms
     CGroup: /system.slice/nginx.service
             ├─9919 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─9920 "nginx: worker proces

با نصب Nginx یه سری دستورات هم اضافه میشن که میتونید از اونا هم استفاده کنید:

sudo nginx -s [signal]

# signals
sudo nginx -s stop	# fast shutdown
sudo nginx -s quit	# graceful shutdown
sudo nginx -s reload	# changing configuration, starting new worker processes with a new configuration, graceful shutdown of old worker processes
sudo nginx -s reopen	# re-opening log files

دستور stop سریع Nginx را میبندد، فارغ از اینکه آیا درخواستی از سوی کاربری در حال اجرا است یا خیر. به بیان ساده‌تر اگر کاربری در حال حاضر در سایت ما باشد و مثلا در حال لود یک صفحه یا دانلود یک فایل باشد، کارش نیمه تمام می‌ماند و تجربه کاربری بدی از سایت ما خواهد داشت.
دستور quit همان کار stop را انجام می‌دهد، ولی منتظر می‌ماند تا کاربرانی که در حال کاری هستند، کارشان را تمام کند و سپس در مغازه رو میبنده.

در کل کلمه graceful، کلمه خوبی است. سعی کنید اگر در اینترنت برای موارد مشابه دنبال چیزی می‌گردید از این کلمه هم استفاده کنید.

فایل‌ها و مسیرهای مهم Nginx 

# Base config file
/etc/nginx/nginx.conf

# Default config
/etc/nginx/sites-enabled/default

# Logs will be in
/var/log/nginx/

# Custom configs will go in
/etc/nginx/conf.d/

# Default webroot
/var/www/html

فایل کانفیگ اصلی Nginx در /etc/nginx/nginx.conf ه که میشه گفت نقطه شروع Nginx همینجاست. اگه نگاهی به این فایل بندازید چیزی شبیه به این می‌بینید:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
}

http {

	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

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

	gzip on;

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

به قسمتی که نوشته http دقت کنید. معمولا ساختار وب‌سایت‌هایی که در nginx تعریف میکنید به این صورته. اول یه بلاک http و بعد به ازای هر سایت یه بلاک server و بعد برای مسیرها و روت‌های سایت هام بلاک location میزاریم.
در کد بالا بلاک http‌رو میبینید. می‌توانید سایت‌ها رو نیز همینجا تعریف کنید ولی برای تمیزی کار، بلاک‌های server در فایل‌های جداگانه نوشته میشه.

(include /etc/nginx/sites-enabled/*)

http {
  server {
    server_name www.site1.com;
    location /relative-to-root/dir {
    }

    location /static/ {
    }

  }

  server {
    server_name www.site2.com;
    location /sample {
    }

  }
}

سرو کردن فایل‌های استاتیک

سرو کردن فایل‌های استاتیک از پایه‌ای ترین کارهای یه وب سروره. فقط کافیه یه فایل txt, html, zip, jpeg یا هر فایل دیگه‌ای رو قرار بدید تا سرور راحت به کاربر برگردونه.

در مثال زیر یه سایت در پورت ۷۷۷ ایجاد شده. اگه به آدرس localhost:777 برید میتونید ببینید. در مسیر روت autoindex on روشن است یعنی میتوانید محتویات پوشه‌ها در مسیرهایی که میروید رو ببینید. برای مثال اگه به /static‌ بروید، فایل‌ها و پوشه‌های موجود در سیستم خودتون که در آدرس /path/to/public/directory هست رو ببینید.

server {
  listen 0.0.0.0:7777;
  root /path/to/public/directory;

  location /relative-to-root/dir {
    autoindex off;
    # Default to index.htm or index.html
    index index.html, index.htm
  }

  location /static/ {
    alias /var/www/static-content/;
  }

  location / {
    # Directory listing (risky!)
    autoindex on;
  }

}

ساخت یک Reverse Proxy

در مثال زیر، پورت ۸۰ رو به سمت پورت ۹۹۹۹ هدایت کردیم.

http {
  server {
    listen 0.0.0.0:80;
    listen [::]:80;

    server_name mydomain.com;

    location / {
      proxy_pass http://localhost:9999/;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

پردازش درخواست‌ها

می‌تونیم صرفا از خود Nginx استفاده کنیم تا یه درخواستی رو به صورت متن یا json به کاربر برگردونیم.

location ~ ^/get_text {
  default_type text/html;
  return 200 'This is test text!';
}

location ~ ^/get_json {
  default_type application/json;
  return 200 '{"status":"success","result":"nginx test json"}';
}

پردازش درخواست‌ها با یک زبان برنامه‌نویسی دیگه

در دنیای واقعی نمیتونیم همه درخواست‌ها رو با Nginx و به صورت بالا پردازش کنیم. (البته اگه حوصله و اعصابشو دارید میتونید این کار رو بکنید. فکر کنم سرعت پردازشش هم سریعتره)

یه چیزی وجود داره به اسم CGI (Common Gateway Interface) که در واقع یه سرور محسوب میشه. که البته این قدیمی شده و الان از fastCGI استفاده می‌کنند.

خلاصه‌اش این میشه که Nginx درخواست رو به سمت سرور FastCGI میفرسته تا اون درخواست رو پردازش کنه و بعد نتیجه رو به کاربر برمیگردونه. زبان‌های مختلف FastCGI های مختلف دارن. مثلا زبان PHP همون PHP-FPM معروف رو داره که مخفف PHP FastCGI Process Manager میشه.

یا مثلا پایتون یه چیزهایی مثل uWSGI و Gunicorn رو داره.

بیاین یک مثال ساده با Nginx بزنیم.

۱. نصب

اول از همه یه نسخه از php-fpm‌ رو نصب کنید. اینجا ما برای php 8.1‌رو نصب کردیم. شما میتونید هر نسخه‌ای که دوست داشتید رو نصب کنید:

sudo apt install php8.1-fpm

۲. کانفیگ

کانفیگ‌های php-fpm معمولا در مسیر زیره. البته به نسخه php هم توجه کنید. اگه شما نسخه دیگه‌ای رو نصب کردید به همون مسیر برید:


/etc/php/8.1/fpm/pool.d/www.conf

در این فایل کانفیگ‌های زیادی می‌بینید. در پایین سه تا از مهم‌هاشو آوردم:

listen در واقع داره بهتون میگه برای ارتباط با ساکت این fpm باید چیکار کنید. نیازی به تغییر این مقادیر نیست. صرفا ما به مقدار listen نیاز داریم.

listen = /run/php/php8.1-fpm.sock
listen.owner = www-data 
listen.group = www-data

۳. کانفیگ‌های Nginx

به کانفیگ‌های سایتی که میخواهید php-fpm رو بهش اضافه کنید برید. در اینجا من سراغ همون سایت default رفتم.

در کانتکست یا همون بلاک server تیکه کد زیر رو اضافه کنید:

location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php8.1-fpm.sock
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params;
}

در اینجا ما داریم به nginx میگیم که هر درخواستی که آخرش .php داشت رو بفرست به این php-fpm تا ردیفش کنه.

fastcgi_pass‌ آدرس سرور fastcgi هستش که در فایل کانفیگش دیدیم. (میتونید اونو تغییر بدید و بعد sudo systemctl restart php8.1-fpm رو بزنید ولی هر چی اونجا گذاشتید باید اینجا هم همونو بزارید، به علاوه یه unix: اولش)

جمع‌بندی

کاربردهای Nginx به همینجا ختم نمیشه. خیلی قابلیت‌های دیگه مثل Load Balancing, Caching, Websocket و چیزهای دیگه داره که باید بررسی کنیم. با وجود این قابلیت‌ها Nginx حتی در Kubernetes هم به عنوان Ingress Controller استفاده میشه. میدونم کلمه قلبمه سلمبه‌ایه. ولی خب بعدا یه سری بهش میزنیم تا ببینید چیه.

خوش‌حال میشم نظرتون رو درباره این مقاله بدونم.

دیدگاهتان را بنویسید