وب سرویس Nginx یا انجین ایکس یکی از محبوبترین وب سرورهای وب در جهان است و در وبسایتهای بزرگ و با بازددید بالا به عنوان وب سرویس استفاده میشود.
Let’s Encrypt یک صادر کننده گواهینامه امنیتی SSL یا CA است که بصورت رایگان جهت نصب بر روی وبسرور و استفاده به عنوان پروتکول HTTPS میباشد.
در این مطلب آموزشی بصورت کامل نحوه آموزش نصب Nginx در Debian 10 و همچنین نصب Let’s Encrypt به عنوان صادر کننده گواهینامه SSL و همچنین آموزش تمدید خودکار SSL فرا خواهیم گرفت.
یک رکورد A با your_domain
شما و اشاره به آدرس IP سرور
یک رکورد A با www.your_domain
شما اشاره به آدرس IP سرور (اختیاری)
توجه: your_domain
آدرس دامنه شما میباشد (بصورت مثال mahancloud.com)
پکیج یا بسته Nginx بصورت پیشفرض در Debian موجود است و میتوان با استفاده مدیریت پکیج Debian بر روی سرور نصب کرد.
قبل از آن میبایست ایندکس بستههای محلی (Local) را با استفاده از دستور زیر بروزرسانی مینماییم.
sudo apt update
در حال حاضر میتوانیم با استفاده از دستور زیر، Nginx را نصب نماییم.
sudo apt install nginx
جهت تایید نصب، Enter را بزنید و پس از آن Nginx و بستههای وابسته به آن نصب میگردند.
پس از نصب 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
در این قسمت با چند دستور اصلی مدیریت 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
هنگام استفاده از وب سرور 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
/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 میشوند.
اولین قدم برای استفاده از 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
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
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
گواهینامه Let’s Encrypt فقط برای 90 روز اعتبار دارد. این موضوع باعث شده است که کاربران نیاز به اجرای خودکار شدن تمدید گواهینامه امنیتی داشته باشند.
بدین منظور با اضافه کردن اسکریت تمدید به /etc/cron.d
میتوانیم روال تمدید را بصورت خودکار انجام دهیم.
این اسکریپت روزانه 2 بار اجرا میشود و گواهینامههایی که کمتر از 30 روز تا زمان اتمام آنها باقی مانده است را مجدداً تمدید میکند.
جهت بررسی پروسه تمدید، میتوانیم دستور زیر را بصورت دستی اجرا کنیم.
sudo certbot renew --dry-run
در صورت عدم دریافت خطا، روند تمدید خودکار بصورت صحیح اجرا خواهد شد.