سرویس دهنده Nginx


Nginx چیست؟

یک سرویس دهنده سبک و سریع وب می باشد که امکانات بسیار زیادی را به صورت رایگان ارایه می دهد.

از این امکانات می توان به مواردی مانند سرویس دهنده وب پراکسی بازگشتی WAF و غیره نام برد.

در این مقاله چه چیزهایی یاد می گیریم؟

  • تنظیمات سرویس Nginx جهت Load Balancer
  • تنظیم Naxsi به عنوان WAF بر روی Nginx

نصب Nginx

جهت نصب Nginx ابتدا به مسیر port های سیستم می‌رویم و آن‌ها را update می کنیم.

#cd /usr/ports
#portsnap fetch update

بعد از اتمام عملیات به روز رسانی portها به مسیر زیر رفته و سرویس Nginx‌ را نصب کنیم.

#cd /usr/ports/www/nginx
#make install clean
نکته:
برای اینکه naxsi را نصب کنید باید در منوی کانفیگ سرویس Nginx تیک مربوط به naxsi را علامت بگذارید.
نکته:
جهت راه اندازی سرویس Nginx همراه با https تیک HTTP_SSL را علامت بگذارید.

بعد از اتمام مرحله نصب نوبت به تنظیمات سرویس می رسد.

تنظیمات سرویس Nginx

برای تنظیمات سرویس دهنده Nginx دو روش در پیش رو داریم:

۱- تنظیم Nginx به صورت HTTP:

برای این منظور ابتدا فایل مربوط به سرویس دهنده Nginx را که در مسیر زیر می باشد را ویرایش می کنیم.

# vi /usr/local/etc/nginx/nginx.conf

و قسمت مربوط به server را به صورت زیر تنظیم می کنیم.

   server {
       listen       80;
       server_name  1st-nginx;
        include                     mime.types;
        default_type                application/octet-stream;
        server_tokens               off;
        sendfile                    on;
        keepalive_timeout           65;
        client_body_timeout         10;
        client_header_timeout       10;
        send_timeout                10;
        client_body_buffer_size     1K;
        client_header_buffer_size   1k;
        client_max_body_size        1k;
        large_client_header_buffers 2 1k;
        #charset koi8-r;
        access_log  logs/host.access.log  main;
        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }

توجه داشته باشید که در این قسمت تنظیمات ابتدایی جهت امن کار کردن سرویس Nginx گنجانده شده است و اگر شما به تنظیمات و دسترسی های بیشتری احتیاج دارید می توانید آن‌ها را در همین قسمت بگنجانید.

۲- تنظیم Nginx به صورت HTTPS

برای تنظیم سرویس دهنده جهت ارایه یک سرویس وب به حالت امن ما نیاز داریم که ابتدا در هنگام نصب ماژول مربوط به SSL را فعال کرده باشیم و همچنین فایل‌های certificate مخصوص رمزنگاری صفحات را داشته باشیم.

نکته:
فایل‌های certificate را هم می توانیم از CA های جهانی تهیه کنیم و هم می توانیم خودمان آنها را درست کنیم که در این مقاله خودمان آنها را درست و استفاده می کنیم.

نحوه تولید فایل‌های certificate به صورت دستی

برای این کار ما باید ابتدا یک کلید خصوصی (Private Key) بسازیم. برای این منظور دستور زیر را اجرا می کنیم.

# openssl genrsa -out server.key 2048

بعد از ساختن کلید خصوصی باید یک فایل (CSR (Certificate Signing Request را بسازیم برای این منظور دستور زیر را اجرا می کنیم.

# openssl req -new -key server.key -out server.csr

بعد از ساختن CSR نوبت به ساختن اصلی‌ترین فایل مورد نیاز با استفاده از دو فایل .key و .csr به نام فایل .crt می رسد. برای این منظور دستور زیر را اجرا می کنیم.

# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

بعد از اجرای دستور بالا فایل‌های certificate‌ مورد نیاز ما ساخته شده و آماده استفاده می باشند.

جهت اینکه سرویس دهنده ما به صورت یک سرویس امن اجرا شود ما باید قسمت server فایل nginx.conf را به صورت زیر ویرایش کنیم.

ابتدا فایل را با ویرایشگر باز می کنیم.

# vi /usr/local/etc/nginx/nginx.conf

سپس به صورت زیر پیرایش می کنیم.

    server { 
        listen       443 ;
        server_name  1st-nginx;
        include                     mime.types;
        default_type                application/octet-stream;
        server_tokens               off;
        sendfile                    on;
        keepalive_timeout           65;
        client_body_timeout         10;
        client_header_timeout       10;
        send_timeout                10;
        client_body_buffer_size     1K;
        client_header_buffer_size   1k;
        client_max_body_size        1k;
        large_client_header_buffers 2 1k;
        ssl                  on;
        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;
        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;
 
        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }

توضیح برای این قسمت اینکه جهت اینکه فایل‌های certificate تولیدی را به سرویس دهنده معرفی کنیم باید خطوط زیر را با استفاده از اطلاعات مربوط به مسیر فایل‌های certificate ویرایش کنیم. به صورت زیر:

    ssl on;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;
نکته:
اگر بخواهیم Nginx فقط به صورت HTTPS کار کند قسمت server فایل nginx.conf را به صورت زیر ویرایش می کنیم.
    server { 
        listen       80 ssl;
        listen       443 ssl;
        server_name  1st-nginx;
        include                     mime.types;
        default_type                application/octet-stream;
        server_tokens               off;
        sendfile                    on;
        keepalive_timeout           65;
        client_body_timeout         10;
        client_header_timeout       10;
        send_timeout                10;
        client_body_buffer_size     1K;
        client_header_buffer_size   1k;
        client_max_body_size        1k;
        large_client_header_buffers 2 1k;
        ssl                  on;
        ssl_certificate      test-server.crt;
        ssl_certificate_key  test-server.key;
        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }

توجه کنید که در این حالت nginx تمام درخواست های دریافتی در پورت ۸۰ را هم به صورت ssl شده در ۴۴۳ دریافت می کند.

در اینجا تنظیمات اولیه سرویس دهنده Nginx به پایان رسیده و به قسمت بعدی می رویم.

تنظیم Nginx جهت اجرای فایل‌های .php

برای این منظور قسمت server فایل nginx.conf را ویرایش کرده و اطلاعات زیر را به آن اضافه می کنیم.

       location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }

نحوه فعال کردن Load balancer در Nginx

جهت فعال سازی این قابلیت از تگ زیر استفاده می کنیم:

upstream SERVERNAME {
				
				YOUR LOAD BALANCER CONFIGURATION
	}

در این قسمت شما می توانید از متغیرهای زیادی استفاده کنید تا حالت load balacer سرویس دهنده شما هرچه بیشتر منعطف شود .

ما در اینجا به ۳ نوع از معروف ترین این متغیرها اشاره می کنیم

– weight: این متغیر ماکزیمم تعداد درخواست هایی که هر سرویس دهنده می تواند به آن رسیدگی کند را مشخص می‌کند و در صورت درست درآمدن شرط بقیه درخواست ها به سرویس دهنده بعدی می‌رود.

– max_fails: این متغیر ماکزیمم تعداد درخواست های fail شده را مشخص می‌کند و در صورت درست از آب در آمدن شرط بقیه درخواست ها به سرویس دهنده بعدی می رود.

– fails_timeout: این متغیر ماکزیمم زمانی را مشخص می‌کند که اگر درخواست اجرا نشد fail شده به حساب می‌آید.

در زیر مثال‌هایی از حالت‌های بالا همراه با توضیحات هر مثال می بینید.

مثال ۱:

upstream acme {
	ip_hash;
	server 192.168.0.2 weight=3;
	server 192.168.0.3 weight=2;
	server 192.168.0.4;
}

برای توضیح مثال بالا باید بگوییم که ابتدا درخواست های دریافتی را به سرویس دهنده با آدرس ۱۹۲٫۱۶۸٫۰٫۲ می فرستد و اگر تعداد درخواست ها بیشتر از ۳ درخواست شد درخواست بعدی یعنی درخواست چهارم به آدرس ۱۹۲٫۱۶۸٫۰٫۳ می‌رود و اگر تعداد درخواست های این سرویس دهنده هم بیشتر از ۲ تا شد درخواست شماره ۷ به سرویس دهنده به آدرس ۱۹۲٫۱۶۸٫۰٫۳ می رود.

مثال ۲:

    upstream 1st-nginx {
                ip_hash;
                server 192.168.1.3 max_fails=3 fail_timeout=30s;
                server 192.168.1.4;
   } 

برای توضیح مثال بالا باید بگوییم که ابتدا درخواست ها به سرویس دهنده با آدرس ۱۹۲٫۱۶۸٫۱٫۳ می‌رود و تا جایی که تعداد درخواست های fail شده هم زمان به عدد ۳ برسد در صورت برقرار شدن این شرط درخواست های بعدی به آدرس ۱۹۲٫۱۶۸٫۱٫۴ ارسال می شود. همان طور که می بنید مقدار fail_timeout در این مثال به اندازه ۳۰ ثانیه قرار داده شده است .

نحوه فعال سازی قابلیت WAF در Nginx

جهت فعال سازی این قابلیت شما باید ابتدا ماژول naxsi را در هنگام نصب فعال می کردید و بعد هم باید فایل مربوط به naxsi.rules و ngnix.conf را ویرایش کنید.

خوب برای این کار به مسیر زیر می‌رویم

#cd /usr/local/etc/ngnix

سپس ابتدا یک فایل به نام naxsi.rules می سازیم و به صورت زیر ویرایش می کنیم.

#vi naxsi.rules
LearningMode; #Enables learning mode
SecRulesEnabled;
#SecRulesDisabled;
DeniedUrL "/RequestDenied";
## check rules
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS <= 8" BLOCK;

و سپس فایل nginx.conf را ویرایش کرده و خطوط زیر را به انتهای آن اضافه می کنیم.

#include WAF setting
include /usr/local/etc/nginx/naxsi_core.rules;
include /usr/local/etc/nginx/naxsi.rules;
نکته:
فایل naxsi_core.rules حاوی یکسری دستورالعمل های ابتدایی و اصلی ماژول naxsi می باشد.

نحوه تنظیم کردن پراکسی بازگشتی (Reverse Proxy) در Nginx

برای این منظور ابتدا باید ماژول proxy_pass را فعال کرده باشید و سپس فایل nginx.conf را ویرایش کرده و در قسمت server اطلاعاتی مانند زیر اضافه کنید:

location / {
proxy_pass http://acme;
}

توضیح اینکه تمام درخواست های مربوط به آدرس IP سرویس دهنده را به آدرس http://acme می فرستد.

بعد از انجام هر کدام از تغییرات بالا جهت اعمال در سرویس دهنده باید آن را restart کنید.

#/usr/local/etc/rc.d/nginx restart

در صورتی که بخواهید Nginx بعد از هر بار reboot کردن سیستم به صورت خودکار بالا بیاید کافی است فایل rc.conf را با دستورت زیر ویرایش کنید.

#echo 'nginx_enable=”YES”' >> /etc/rc.conf