آموزش نصب و ایمن سازی Nginx به همراه Let’s Encrypt در Debian 10

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

Let’s Encrypt یک صادر کننده گواهینامه امنیتی SSL یا CA است که بصورت رایگان جهت نصب بر روی وب‌سرور و استفاده به عنوان پروتکول HTTPS می‌باشد.

در این مطلب آموزشی بصورت کامل نحوه آموزش نصب Nginx در Debian 10 و همچنین نصب Let’s Encrypt به عنوان صادر کننده گواهینامه SSL و همچنین آموزش تمدید خودکار SSL فرا خواهیم گرفت.

پیش نیازها

  • مطمئن شوید که با یک کاربر با دسترسی sudo به سرور وارد شده‌اید.
  • یک دامنه ثبت شده به همراه رکوردهای مورد نیاز بصورت زیر:

یک رکورد A با your_domain شما و اشاره به آدرس IP سرور

یک رکورد A با www.your_domain شما اشاره به آدرس IP سرور (اختیاری)

توجه: your_domain آدرس دامنه شما می‌باشد (بصورت مثال mahancloud.com)

مرحله 1 – نصب وب سرور Nginx

پکیج یا بسته Nginx بصورت پیش‌فرض در Debian موجود است و می‌توان با استفاده مدیریت پکیج Debian بر روی سرور نصب کرد.

قبل از آن می‌بایست ایندکس بسته‌های محلی (Local) را با استفاده از دستور زیر بروزرسانی می‌نماییم.

sudo apt update

در حال حاضر می‌توانیم با استفاده از دستور زیر، Nginx را نصب نماییم.

sudo apt install nginx

جهت تایید نصب، Enter را بزنید و پس از آن Nginx و بسته‌های وابسته به آن نصب می‌گردند.

مرحله 2 – بررسی وب سرور

پس از نصب Nginx، وب سرور از قبل Start شده است و می‌بایست به درستی کار کند.

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

systemctl status 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 Wed 2020-02-16 00:52:54 UTC; 4min 23s ago
     Docs: man:nginx(8)
 Main PID: 3942 (nginx)
    Tasks: 3 (limit: 4719)
   Memory: 6.1M
   CGroup: /system.slice/nginx.service
           ├─3942 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─3943 nginx: worker process
           └─3944 nginx: worker process

همانطور که در بالا مشاهده می‌کنید، وب‌سرویس با موفقیت Start شده است.

برای تایید صحت عملکرد، می‌توانیم آدرس IP سرور خود را در مرورگر وارد نماییم.

در صورتی که آدرس IP سرور خود را نمی‌دانیم، می‌توانیم از یکی از دستورات زیر جهت پیدا کردن IP سرور استفاده نماییم.

ip a s | sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}'
curl https://ipecho.net/plain; echo
curl https://icanhazip.com

مرحله 3 – مدیریت پردازش‌های Nginx و دستورات اولیه مدیریتی Nginx

در این قسمت با چند دستور اصلی مدیریت Nginx با هم آشنا خواهیم شد.

متوقف (Stop) کردن وب سرور Nginx:

sudo systemctl stop nginx

شروع (Start) کردن وب سرور Nginx:

sudo systemctl start nginx

راه‌اندازی مجدد (Stop و Start یا Restart) کردن وب سرور Nginx:

sudo systemctl restart nginx

در صورت ایجاد تغییرات ساده در پیکربندی وب سرور و غالباً بدون افت اتصالات از دستور زیر استفاده می‌کنیم:

sudo systemctl reload nginx

بصورت پیش‌فرض، Nginx بصورت خودکار فعال (Enable) و شروع (Start) شده است، در صورتی که قصد غیر فعال سازی Start وب سرور پس از بوت شدن سرور را داریم، می‌توانیم از دستور زیر استفاده کنیم:

sudo systemctl disable nginx

جهت فعال‌سازی مجدد نیز می‌توانیم از دستور زیر استفاده کنیم:

sudo systemctl enable nginx

مرحله 4 – تنظیمات بلاک‌های Server

هنگام استفاده از وب سرور Nginx، می‌توانیم از بلاک‌های سرور (Server Blocks) همانند Virtual Hosts در آپاچی (Apache) برای پیکربندی جزییات و میزبانی بیش از یک دامنه در سرور استفاده نماییم.

وب سرور Nginx در Debian 10 دارای یک بلاک سرور فعال بصورت پیش‌فرض در /var/www/html می‌باشد. این پیکربندی برای استفاده از یک سایت در سرور مناسب است، ولی اگر نیاز به مدیریت چند سایت بر روی سرور داشته باشیم، نیاز به تغییراتی جهت کنترل وب‌سایت‌ها داریم.

یک دایرکتوری یا شاخه با استفاده از دستور زیر ایجاد می‌نماییم.

sudo mkdir -p /var/www/your_domain/html

در مرحله بعد، مالکیت دایرکتوری را به متغیر محیطی $USER اختصاص می‌دهیم.

نکته: $USER کاربر فعلی سیستم یا سرور می‌باشد.

sudo chown -R $USER:$USER /var/www/your_domain/html

با استفاده از دستور زیر، مجوز (پرمیشن) صحیح را بر روی دایرکتوری خود تنظیم می‌نماییم.

sudo chmod -R 755 /var/www/your_domain

سپس با استفاده یک ویرایشگر (مانند vi یا nano) یک فایل index.html بصورت نمونه ایجاد می‌کنیم.

sudo vi /var/www/your_domain/html/index.html

درون فایل ایجاد شده، نمونه کد HTML زیر را اضافه می‌کنیم.

Success! Your Nginx server is successfully configured for your_domain.

فایل را ذخیره و از آن خارج می‌شویم.

برای اینکه Nginx بتواند این محتوا را پردازش و ارائه دهد، باید یک دستورالعمل صحیح که به دایرکتوری ایجاد شده ما اشاره می‌کند یه بلاک سرور (Server Block) ایجاد کنیم. جهت عدم تغییر پیکربندی پیش‌فرض یک فایل کانفیگ جدید با آدرس /etc/nginx/sites-available/your_domain ایجاد می‌کنیم.

sudo vi /etc/nginx/sites-available/your_domain

محتویات و تنظیمات زیر را در فایل ایجاد شده اضافه می‌نماییم.

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

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

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

در ادامه یک لینک از فایل کانفیگ ایجاد شده به دایرکتوری‌های فعال اضافه می‌نماییم.

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

اکنون دو بلاک سرور ایجاد شده فعال و پیکربندی شده‌اند و به درخواست

با استفاده از دستور زیر مطمئن می‌شویم که خطایی در انجام تغییرات و پیکربندی رخ نداده است.

sudo nginx -t

در صورت انجام صحیح تنظیمات، با خروجی زیر مواجه می‌شویم.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

پس از انجام پیکربندی، Nginx را مجدداً راه‌اندازی می‌کنیم تا تغییرات انجام شده اعمال و فعال شوند.

sudo systemctl restart nginx

آشنایی با فایل‌ها و دایرکتوری‌های مهم Nginx

/var/www/html: محتوای وب واقعی که بصورت پیش‌فرض فقط شامل صفحه پیش‌فرض Nginx است.

/etc/nginx: تمامی فایل‌های پیکربندی (کانفیگ) Nginx در این دایرکتوری قرار دارد.

/etc/nginx/nginx.conf: فایل پیکربندی اصلی Nginx

/etc/nginx/sites-available/: این دایرکتوری بلاک‌های سرور هر سایت در آن قرار گرفته است. Nginx بصورت پیش‌فرض از دایرکتوری جهت لود کردن محتوا و وب استفاده نمی‌کند، مگر اینکه به دایرکتوری sites-enabled لینک شده باشد. بصورت معمول، تمامی پیکربندی‌های بلاک سرور در این دایرکتوری انجام می‌شود و سپس به دایرکتوری sites-enabled لینک می‌شوند.

/etc/nginx/sites-enabled/: این دایرکتوری بلاک‌های سرور فعال هر سایت در آن قرار گرفته است و بصورت معمول این فایل‌ها با لینک دادن از دایرکتوری sites-available ایجاد می‌شوند.

/var/log/nginx/access.log: کلیه درخواست‌های ارسال شده به وب سرور در این فایل Log (لاگ) می‌شوند، مگر اینکه در پیکربندی Nginx این مقادیر را تغییر دهیم.

/var/log/nginx/error.log: تمامی خطاهای Nginx در این فایل Log می‌شوند.

مرحله 5 – نصب Certbot

اولین قدم برای استفاده از Letsencrypt و صدور گواهینامه امنیتی SSL، نصب Certbot بر روی سرور می‌باشد.

پکیج یا بسته نصبی python3-certbot-nginx که بر روی ریپازیتوری (مخزن) دبیان قرار دارد، این امکان را به ما می‌دهد که پلاگین Certbot را بر روی Nginx نصب کنیم.

قبل از نصب بسته python3-certbot-nginx لیست بسته‌ها را بروز می‌کنیم.

sudo apt update

سپس با استفاده از دستور زیر، بسته‌های مورد نظر را نصب می‌کنیم.

sudo apt install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing python3-zope.interface

پس از آن بسته python3-certbot-nginx را با دستور زیر نصب می‌کنیم.

sudo apt install python3-certbot-nginx

مرحله 6 – تایید پیکربندی یا کانفیگ Nginx

Certbot باید بتوانید بلاک سرور (Server Block) را در تنظیمات Nginx در بخش server_name متناسب با نام دامنه درخواستی جهت صدور گواهینامه SSL پیدا کنید.

در بخش تنظیمات Nginx مربوط به دامنه خود، می‌بایست در بخش Server Block و server_name را بصورت صحیح ویرایش نمایید.

بدین منظور، فایل زیر را ویرایش نمایید.

sudo vi /etc/nginx/sites-available/your_domain

در بخش server_name باید تنظیمات بصورت زیر باشد.

...
server_name your_domain www.your_domain;
...

پس از انجام تنظیمات با دستور زیر مطمئن شوید که خطایی در تنظیمات وجود ندارد.

sudo nginx -t

پس از آن سرویس Nginx را جهت بارگیری مجدد Reload میکنیم.

sudo systemctl reload nginx

مرحله 7 – دریافت گواهینامه امنیتی SSL

Certbot جهت دریافت گواهینامه SSL روش‌های مختلفی ارائه داده است، پلاگین Nginx یک روش مطمئن جهت دریافت گواهینامه می‌باشد.

جهت دریافت گواهینامه SSL، از دستور زیر استفاده می‌کنیم.

sudo certbot --nginx -d your_domain -d www.your_domain

پس از اجرای این دستور، Certbot یک آدرس ایمیل دریافت می‌کند و با سرور Letsencrypt جهت دریافت گواهینامه ارتباط برقرار می‌کند.

اگر این ارتباط موفقیت آمیز باشد، Certbot چگونگی انجام تنظیمات HTTPS را خواهد پرسید.

نمونه خروجی:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

انتخاب خود را انجام می‌دهیم و پس از Enter کردن تنظیمات بروز خواهند شد و Nginx جهت اجرای تنظیمات جدید Reload خواهد شد.

Certbot با پیغام زیر تایید انجام صحیح نصب گواهینامه امنیتی را اعلام خواهد کرد.

نمونه خروجی:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/your_domain/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/your_domain/privkey.pem
   Your cert will expire on 2020-15-05. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

مرحله 8 – تمدید خودکار گواهینامه SSL

گواهینامه Let’s Encrypt فقط برای 90 روز اعتبار دارد. این موضوع باعث شده است که کاربران نیاز به اجرای خودکار شدن تمدید گواهینامه امنیتی داشته باشند.

بدین منظور با اضافه کردن اسکریت تمدید به /etc/cron.d می‌توانیم روال تمدید را بصورت خودکار انجام دهیم.

این اسکریپت روزانه 2 بار اجرا می‌شود و گواهینامه‌هایی که کمتر از 30 روز تا زمان اتمام آن‌ها باقی مانده است را مجدداً تمدید می‌کند.

جهت بررسی پروسه تمدید، می‌توانیم دستور زیر را بصورت دستی اجرا کنیم.

sudo certbot renew --dry-run

در صورت عدم دریافت خطا، روند تمدید خودکار بصورت صحیح اجرا خواهد شد.