nginx چیست؟ به همراه دوره آموزش nginx

امیرحسین بیگدلو 4 ماه قبل

امروز ما NGINX، یک وب سرور منبع باز و گزینه اصلی و رقیب Apache HTTP Server را پوشش خواهیم داد. NGINX از بدو تأسیس محبوبیت خود را کسب کرده است و در طیف وسیعی از برنامه ها برای سرویس دهی به وب ، پراکسی معکوس ، ذخیره سازی ، تعادل بار ، پخش رسانه و موارد دیگر مورد استفاده قرار می گیرد.

 

دوره پیشنهادی: دوره آموزش nginx

 

تاریخچه NGINX

در سال 2002، یک چالش به اسم C10K در دنیای اینترنت برگزار شد که برنامه‌نویسان موظف بودند برنامه‌ای بسازند که بتواند 10 هزار درخواست را همزمان پاسخ دهد.  به عنوان راه‌حل، مهندس نرم افزار Igor Sysoev اولین نسخه عمومی NGINX را منتشر کرد که متکی به معماری ناهمگام و مبتنی بر رویداد است. این بدان معنی است که بر خلاف Apache HTTP Server ، وب سرور NGINX چندین پردازش و رشته را برای درخواست ها در یک فرآیند کارگر انجام می دهد ، در مقایسه با پردازش ها یا رشته های اختصاصی ، که Apache به آن معروف است.

 


 

NGINX در مقابل Apache

زمانی بود که آپاچی بدون هیچ گونه سوالی در دنیای وب‌سرور سلطنت می کرد و همه چیز پشت آپاچی بود. امروز ، در سال 2019 ، چشم انداز وب سرور تغییر کرده است و بسته به عملکرد خاص سرور شما ، میتوانید از گزینه‌هایی مثل nginx یا iis استفاده کنید.. در هر صورت ، Apache به سرعت در حال از دست دادن محبوبیت است زیرا برنامه های وب و عملکردهای آنها در حال پویاتر شدن و خاص بودن برای اهداف خود هستند.

 

یک دهه پیش ، هنگامی که برنامه های وب و سرورها تقریباً یکسان بودند ، Apache می توانست تقریباً همه مواردی را که نیاز دارید برطرف کند. اما با رشد وب و نیازهای مختلف ، NGINX شروع به پر کردن نیازی کرد که Apache نمی توانست. Apache برای میزبانی مشترک از چندین سایت عالی است ، اما NGINX قدرت و تسلط خود را در مورد محتوای پویا ، ویژگی های پیچیده و انعطاف پذیری محض در یک فضای دائماً در حال تغییر محتوای وب نشان می دهد.

 


 

NGINX چه تفاوتی با آپاچی دارد؟

NGINX پس از Apache وارد فضای سرور شد ، بنابراین توسعه دهندگان این مزیت را داشتند که از مسائل مربوط به سرویس دهی وب و محدودیت های فنی که Apache داشت آگاه باشند.

 

رسیدگی مستقیم به این مسائل و محدودیت ها NGINX به معماری تک رشته ای رویداد محور ، ناهمگام و متکی وابسته است. با استفاده از قدرت اساسی سیستم عامل های مدرن مانند Linux و Unix ، وب سرور NGINX قادر به ارائه حداقل 10 برابر (و اغلب 100-1000x بیشتر) درخواست در هر سرور نسبت به Apache است. با بهینه سازی کارآمد استفاده از حافظه و CPU ، وب سرور NGINX قادر است به سرعت مقیاس بندی کند تا ارتباطات بیشتری با کاربران فراهم کند و در عین حال پهنای باند بهتری را ارائه دهد ، در حالی که در مقایسه با سایر سیستم عامل های مدرن ، منبع کمتری استفاده میکند.

 

اگرچه استفاده از Apache به عنوان load balancer کاملاً قابل انجام است ، اما Apache به قدرت و دوام مشهور است در حالی که NGINX به سرعت ، پاسخگویی و کارایی منابع معروف است. بنابراین داشتن NGINX به عنوان یک پروکسی معکوس با Apache به عنوان سرور backend بسیار رایج تر است.

 


 

NGINX چگونه درخواست های پویا را پردازش می کند؟

شما می توانید تست های معیار را در تمام طول روز انجام دهید اما موارد استفاده در دنیای واقعی یک روش بسیار بهتر برای تعیین نحوه عملکرد سرورها در طبیعت است. ما می توانیم نگاهی بیندازیم به محتوای استاتیک در مقابل پویا ، و اینکه هر سرور چگونه هر دو درخواست را کنترل می کند.

 

 

Apache - بخشی از آنچه Apache را عالی می کند ، قابلیت تنظیم مدولار با MPM یا "ماژول های چند پردازشی" است. Apache کاملاً قادر به مدیریت محتوای استاتیک و پویا از طریق روشهای متداول مبتنی بر فایل و همچنین از طریق کارگران MPM است. با تعبیه پردازنده زبان مورد نیاز در هر نمونه کارگر ، محتوای پویا را می توان بدون تکیه بر اجزای خارجی در سرور اجرا کرد

 

NGINX - به خودی خود ، NGINX قادر به پردازش محتوای پویا به طور طبیعی نیست. به منظور مدیریت یک زبان برنامه نویسی مانند PHP ، NGINX باید درخواست را به پردازنده خارجی که اجرای اسکریپت را کنترل می کند منتقل کند و سپس منتظر ارسال محتوا ، ارسال و آماده ارائه به کاربر نهایی است. این بدان معنی است که مدیران باید ارتباطات را از طریق پروتکل هایی که NGINX می داند مانند http ، FastCGI ، SCGI و uWSGI استفاده کند ، پیکربندی کنند.

 

از آنجا که مفسران پویا خارجی هستند و با فرایندهای کارگر سازگار نیستند ، آنها فقط برای ارائه محتوای پویا استفاده می شوند در حالی که محتوای ثابت را می توان به طور مستقیم ارائه داد. این به NGINX شهرت سرعت و واکنش پذیری می بخشد.

 


 

آموزش نصب nginx در ubuntu

 

ساده ترین راه برای نصب nginx در اوبونتو با استفاده از apt-get است. برای استفاده از بسته رسمی اوبونتو، دستورالعمل های زیر را دنبال کنید.

# See what version is available in the repos
apt-cache show nginx

# Install with apt-get package manager
sudo apt-get install nginx

# It will be started by default. Control it with:
sudo systemctl stop nginx
sudo systemctl start nginx
sudo systemctl restart nginx

# View logs with:
journalctl -u nginx

# Get the status with:
sudo systemctl status nginx

 

مهم‌ترین مسیر‌های nginx بعد از نصب در ابونتو:

 

مسیر فایل کانفیگ: /etc/nginx/nginx.conf/

مسیر فایل کانفیگ پیشفرض: etc/nginx/sites-available/default/

مسیر لاگ فایل‌ها: /var/log/nginx/

مسیر webroot پیشفرض: /var/www/html/

 


 

ارائه فایل های استاتیک

 

ارائه فایل های استاتیک اساسی ترین وظیفه برای یک وب سرور است. فقط فایل های .txt ، .html ، .zip یا هر نوع دیگری را وارد کنید و سرور آنها را مستقیماً باز می گرداند.

 

در این مثال تنظیمات در پورت 777 گوش می دهند، نتیجه در http://localhost:7777 قابل مشاهده است و فهرست دایرکتوری ارائه می شود. همچنین یک مثال از تنظیم کنترل های جداگانه در یک زیردایرکتوری با خاموش کردن فهرست دایرکتوری‌ها و تعیین فایلهای index ذکر شده است. همچنین دایرکتوری /var/www/static-content/ را در آدرس /static/ ارائه می دهد.

 

http {
    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;
        }

    }
}

 


 

یک پروکسی معکوس ایجاد کنید

این پیکربندی ترافیک را از پورت 80 به localhost: 9999 ارسال می کند ، از جمله IP اصلی به عنوان یک عنوان HTTP اضافی ، X-Real-IP. برخی از پروکسی ها به جای آن از X-Forwarded-For استفاده می کنند.

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;
        }
    }
}

 


 

اضافه کردن ssl

این قسمت فرض می کند که شما قبلاً گواهی و کلید خصوصی دارید.

 

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

 

یک گزینه این است که رمزگذاری SSL را در nginx خاتمه دهید و از متن خام برای برقراری ارتباط بین nginx و سرویس وب داخلی خود استفاده کنید. این امر بارگذاری رمزنگاری را بر دوش nginx می گذارد و کار کمتری بر روی سرویس وب شما می گذارد. اگر سرویس وب شما به طور عمومی در دسترس نیست (مگر از طریق rproxy) و در دستگاه مشابه پروکسی زندگی می کند، این به طور کلی یک گزینه امن است. این همان چیزی است که در زیر به آن پرداخته شده است.

 

گزینه دیگر این است که SSL را از طریق nginx به مقصد نهایی منتقل کنید. این بهتر است اگر خدمات شما در پشت پروکسی بر روی ماشین های مختلف زندگی می کند، به این ترتیب ارتباطات شبکه از طریق سیم رمزگذاری می شود، حتی اگر داخلی باشد. اگر سرویس وب مقصد پشت سر پروکسی روی همان دستگاه پروکسی قرار دارد، رمزگذاری آن از طریق nginx سود کمتری دارد. اگر برنامه شما در انجام SSL کند عمل می کند یا اصلاً نمی تواند آن را انجام دهد، اجازه دهید nginx آن را مدیریت کند. اگر برنامه شما باید خود سطح SSL را مدیریت کند، آن را از طریق nginx ارسال کنید.

 

افزودن SSL به سرور در nginx نیاز به افزودن یک کلید واژه ssl به دستور listen و شامل دو گزینه پیکربندی اضافی دارد:

  • ssl_certificate
  • ssl_certificate_key

 

گزینه های SSL بسیار بیشتری وجود دارد که می توانید آنها را در http://nginx.org/en/docs/http/ngx_http_ssl_module.html پیدا کنید ، اما  حداقل دو مورد نیاز گواهی و کلید است.

# Template SSL virtual host
server { 
    listen 0.0.0.0:443 ssl;
    listen [::]:443 ssl;
    server_name www.mydomain.com;

    ssl_certificate /path/to/cert.pem
    ssl_certificate_key /path/to/private-key.pem

    # Optional, set strong ciphers
    ssl_ciphers  HIGH:!aNULL:!MD5;
}

 


 

هدایت HTTP به HTTPS

اگر می خواهید تمام ترافیک HTTP روی پورت 80 را به نسخه امن HTTPS که در پورت 443 گوش می دهد هدایت کنید، یک تغییر مسیر دائمی 301 را روی پورت 80 برای نام دامنه تنظیم کنید. این مثال تمام ترافیک http (اعم از پیشوند www یا غیر www) را به نسخه HTTPS با پیشوند www هدایت می کند.

# Redirect HTTP traffic to HTTPS (both www and non-www)
server {
    listen 0.0.0.0:80;
    listen [::]:80;

    server_name mydomain.com www.mydomain.com;

    # Permanent redirect to HTTPS version with www prefix
    return 301 https://www.mydomain.com$request_uri;
}

 


 

هدایت از non-www به www

اگر از نام دامنه بدون پیشوند برای چیزی استفاده نمی کنید، باید آن را به www.yourdomain.com هدایت کنید. با این کار خطاهای تکراری و تعارض با موتورهای جستجو که صفحه شما را دوبار ثبت می کنند کاهش می یابد.

# Permanent redirect of non-www prefixed traffic to www version
server {
    listen 0.0.0.0:443 ssl;
    listen [::]:443 ssl;

    server_name mydomain.com;

    ssl_certificate /path/to/cert.pem
    ssl_certificate_key /path/to/private-key.pem

    # Permanent redirect to HTTPS version with www prefix
    return 301 https://www.mydomain.com$request_uri;
}

 


 

اضافه کردن اعتبارسنجی ساده http

برای افزودن HTTP basic author، کافی است متغیرهای پیکربندی auth_basic و auth_basic_user_file را تنظیم کنید. برای تولید فایل user، به فایل اجرایی htpasswd احتیاج دارید. می توانید آن را به دو روش نصب کنید:

# Fedora
sudo dnf install httpd-tools

# Ubuntu
sudo apt install apache-utils

 

با -c مانند این یک فایل رمز جدید ایجاد کنید:

# Will prompt for password
htpasswd -c /path/to/.htpasswd myusername 

# No password prompt
htpasswd -c /path/to/.htpasswd myusername mypassword

# Add additional users to an existing file
htpasswd /path/to/.htpasswd newuser

 

سپس ، داخل فایل پیکربندی nginx برای سرور خود ، این خطوط را اضافه کنید:

server {
 # ...
 auth_basic "Restricted access.";
 auth_basic_user_file /path/to/.htpasswd;
 # ...
}

 


 

دیپلوی یک برنامه وب Angular

 

استقرار یک برنامه وب Angular درست مانند ارائه فایل های استاتیک به جز "بازنویسی" URL ها برای عملکرد مستقیم URL ها ، پیکربندی try_files مورد نیاز است. با افزودن آن ، مانند این مثال نشان می دهد ، برنامه Angular هنگام بازدید از URL مستقیم ، همانطور که انتظار می رود رفتار می کند.

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

  root /var/www/angularapp;

  location / {
    try_files $uri $uri/ /index.html;
  }

}

 


 

دیپلوی برنامه های Python WSGI مانند Django و Flask

 

برنامه وب پایتون توسط یک سرور WSGI اجرا می شود. Waitress آسان برای استفاده است و بر روی Windows ، Linux و Mac کار می کند. می توانید از این برنامه برای اجرای هر برنامه WSGI استفاده کنید ، اعم از جنگو ، فلاسک یا هر چیز دیگر. شما معمولاً این سرور WSGI را به عنوان سرویس سیستم تنظیم می کنید. با لینوکس می توانید ایجاد فایل های Systemd Service را دنبال کنید و در Windows ، Python Script را به عنوان سرویس Windows اجرا کنید.

python3 -m pip install waitress
python -m waitress --listen=127.0.0.1:8001 my_app:app 

 

با استفاده از برنامه WSGI که به درخواست های پویا گوش می دهد و به آنها سرویس می دهد ، از Nginx برای بازگرداندن پروکسی درخواست ها به سرور WSGI استفاده خواهید کرد. علاوه بر این ، شما به طور کلی باید برخی از فایل های استاتیک را که می توانند با نام مستعار مکان انجام شوند ، ارائه دهید.

 

پیکربندی سرور nginx معمولی برای برنامه WSGI چیزی شبیه به این است:

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

    server_name example.com;

    location /static/ {
        alias /path/to/app/static/;
    }

    location / {
        proxy_pass 127.0.0.1:8001;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

 


 

نتیجه

 

اگر همه چیز را دنبال کرده اید ، باید نحوه نصب nginx و پیکربندی آن را برای موارد استفاده معمول درک کنید. باید بدانید برای یافتن اطلاعات بیشتر و گزینه های پیکربندی (مستندات nginx.org) به کجا مراجعه کنید. شما باید با راه اندازی nginx به عنوان یک وب سرور ثابت http ، استفاده از آن به عنوان یک پروکسی معکوس ، تنظیم تغییر مسیرها و افزودن SSL راحت باشید. اگر می خواهید بیشتر بیاموزید، میتوانید دوره آموزش nginx را مشاهده کنید.

مطالب مشابه



مونگارد