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
بعد از اتمام مرحله نصب نوبت به تنظیمات سرویس می رسد.
تنظیمات سرویس 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 به صورت دستی
برای این کار ما باید ابتدا یک کلید خصوصی (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;
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;
نحوه تنظیم کردن پراکسی بازگشتی (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