Skip to main content

ساخت سایت استاتیک با 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 است:

git repogit repo hamgitgit repo address

در بخش انتخاب پلن، پلن دلخواه را انتخاب کنید:

choose plan

در صفحه‌ی تکمیل اطلاعات نامی برای اپ انتخاب کنید و پورت را 80 بدهید:

app info

در تب "آدرس هاست" یک زیردامنه از دارکوب را انتخاب کنید یا دامنه‌ی خودتان را قرار دهید.

host address

با زدن "ذخیره و دیپلوی" ایمیج جدید ساخته شده و وبسایت دیپلوی می‌شود و در آدرسی که انتخاب کردید در دسترس خواهد بود.

website