ساخت سایت استاتیک با nginx
مقدمه
ما برای عرضهی سایتهای استاتیک در سطح اینترنت نیاز به یک وب سرور داریم که فایلهای ما را در اختیار بازدیدکنندگان قرار دهد. nginx یک وب سرور قدرتمند است که میخواهیم با کمک آن یک وبسایت شخصی بسازیم. در این مطلب ابتدا به ساختار و مفاهیم تنظیمات nginx میپردازیم و بعد از آن یک وبسایت را به کمک دارکوب دیپلوی خواهیم کرد. در صورتی که به آشنایی با تنظیمات nginx نیازی ندارید میتوانید مستقیما به قسمت دیپلویکردن یک وبسایت استاتیک بروید.
آشنایی با تنظیمات nginx
معرفی فایل nginx.conf
قبل از این که کار عملی را شروع کنیم کمی راجع به تنظیمات nginx که در ایمیج داکر آن موجود است صحبت خواهیم کرد. فایل اصلی تنظیمات nginx در مسیر
/etc/nginx/nginx.conf
قرار دارد. محتوای پیشفرض آن بدون خطوط comment شده به این شکل است:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
در خط اول userی که nginx با آن اجرا میشود نوشته شده است. بعد تعداد پروسههایی که غیر از پروسهی اصلی اجرا میشوند، فایلی که حاوی pid یا Process ID است و جایی که لاگهای خطا قرار است ریخته شوند مشخص شده است.
داخل بلوک event ما اطلاعات پردازش connectionها را میگذاریم. در اینجا حداکثر تعداد connectionهای همزمان هر پروسهی worker را 1024 تعیین کردیم.
حال وارد بلوک http میشویم. خط اول برای تعیین نوع payload برای درخواست http هنگام فرستادن فایلها با extensionهای مختلف است. فایل
/etc/nginx/mime.types
این اطلاعات را دارد. خط بعدی هم نوع payload پیشفرض را مشخص میکند. با log_format نحوهی نوشتن لاگ تعیین شده و لاگهای دسترسی را با این فرمت در مسیر
/var/log/nginx/access.log
میریزد.
خط بعدی برای performance بهتر nginx در برقراری ارتباط با clientهاست. خط بعدی هم مقدار timeout برای keepalive connections را نوشته است. برای ماژولار شدن باقی تنظیمات از مسیر
/etc/nginx/conf.d/
آورده شدهاند که در بخش بعدی بررسی خواهیم کرد.
معرفی فایل default.conf
در بخش قبلی دیدیم که باقی تنظیمات از
/etc/nginx/conf.d/
میآیند.
در این پوشه یک فایل default.conf وجود دارد که میخواهیم محتوای آن را ببینیم:
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
دقت کنید این بلوک server داخل بلوک http در
nginx.conf
قرار گرفته است و مشخصات سرور ما را تعیین میکند. در سه خط اول پورتی که به آن گوش میدهد و نام سرور مشخص شده است. سپس با کمک location گفته شده که اگر درخواستی به مسیر / به وب سرور فرستاده شد، در مسیر
/usr/share/nginx/html
در فایل سیستم دنبال آن بگرد؛ یعنی تمام درخواستها به آنجا خواهد رفت و فایلهای این پوشه به کاربران نشان داده خواهد شد. با عبارت index هم میگوییم وقتی یک درخواست در انتها / داشت به دنبال چه فایلهایی بگردد و آن را به عنوان جواب برگرداند. در چند خط آخر هم نحوهی پاسخگویی به جوابهایی که کد آنها بالای 500 هست را نوشته است.
دیپلویکردن یک وبسایت استاتیک
ایجاد فایل تنظیمات و داکرفایل
فایلهای این آموزش در
این ریپوی عمومی در همگیت
قابل دسترسی است. ابتدا فایلهای این وبسایت خود را در یک ریپوی گیت قرار دهید و آنها را در پوشهای بریزید. در مثال ما نام آن پوشه content است. در این ریپو یک فایل هم برای nginx به نام
static.conf
بسازید. البته نام آن را هرچه میخواهید میتوانید قرار دهید و دقت کنید که در داکرفایل هم مطابق آن تغییر دهید. محتوای آن به شکل زیر است:
server {
server_tokens off;
include /etc/nginx/mime.types;
root /usr/share/nginx/html/;
index index.html;
server_name _;
listen 80 default_server;
access_log /dev/stdout main;
expires 1y;
add_header Cache-Control "public";
}
میتوانید محل root را تغییر دهید. توجه کنید که محل کپی کردن فایل در داکرفایل هم باید مطابق آن شود. نام سرور را _ گذاشتیم تا هر نامی باشد قبول کند. همچنین لاگ درخواستها را در stdout میریزیم. به خط اول هم توجه کنید. در این خط گفته شده که در صفحهی خطا یا در هدر فیلد Server ورژن nginx را ننویسد.در دو خط آخر برای cache شدن محتوا در مرورگر کاربران زمان یک سال را قرار دادهایم تا با هدر فیلد Cache-Control این مورد به مرورگر اطلاع داده شود. سپس در فایلی به نام Dockerfile خطوط زیر را مینویسیم:
FROM nginx:1.20.1
RUN rm /etc/nginx/conf.d/default.conf && rm /usr/share/nginx/html/*
COPY ./content/ /usr/share/nginx/html/
COPY ./static.conf /etc/nginx/conf.d/static.conf
ایمیج مورد استفاده nginx و نسخهی آن 1.20.1 است. میتوانید نسخهی آن را با مراجعه به
صفحهی آن در داکرهاب
nginx انتخاب کنید. سپس فایلهای پیشفرض در
/etc/nginx/conf.d/
و
/usr/share/nginx/html/
پاک شدهاند. دو دستور آخر هم فایل تنظیمات و فایلهای وبسایت را به محل مناسب کپی میکنند. الان ریپوی ما آماده است و میخواهیم با دارکوب آن را دیپلوی کنیم.
دیپلوی سایت با دارکوب
در پنل دارکوب بعد از زدن دکمهی "ساخت اپ" گزینهی "منبع گیت" را انتخاب کنید و آدرس ریپو را به آن بدهید. دقت کنید که مسیر داکرفایل
./docker/Dockerfile
است:
در صفحهی تکمیل اطلاعات نامی برای اپ انتخاب کنید و پورت را 80 بدهید:
در تب "آدرس دامنه" یک زیردامنه از دارکوب را انتخاب کنید یا دامنهی خودتان را قرار دهید.
با زدن "ذخیره و دیپلوی" ایمیج جدید ساخته شده و وبسایت دیپلوی میشود و در آدرسی که انتخاب کردید در دسترس خواهد بود.