استفاده از سوکتهای یونیکس (Unix Sockets) برای ارتباط Nginx و Kestrel
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۴/۱۳ ۰۸:۰۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
localhost:5000) ارسال کند.Nginx -> localhost:5000 -> Kestrel
localhost:5000):.sock). فرآیندها با خواندن و نوشتن در این فایل، با یکدیگر ارتباط برقرار میکنند. این ارتباط مستقیماً توسط هسته سیستمعامل مدیریت میشود و پشته شبکه را دور میزند.chown, chmod). میتوانیم دقیقاً مشخص کنیم که کدام کاربر (مثلاً www-data که کاربر Nginx است) و کدام گروه اجازه دسترسی به این سوکت را دارند. این کار جلوی دسترسی سایر فرآیندهای غیرمجاز به برنامه ما را میگیرد.Program.cs را باز کرده و به Kestrel بگویید که به جای پورت TCP، به یک فایل سوکت گوش دهد.// In Program.cs
var builder = WebApplication.CreateBuilder(args);
// ... services configuration
builder.WebHost.ConfigureKestrel(options =>
{
// --- قبل ---
// options.Listen(System.Net.IPAddress.Loopback, 5000);
// --- بعد ---
// یک مسیر استاندارد برای فایلهای سوکت انتخاب میکنیم
options.ListenUnixSocket("/var/run/kestrel-mywebapp.sock");
});
var app = builder.Build();
// ... app configuration
app.Run();/etc/nginx/sites-available/ باز کنید.# In /etc/nginx/sites-available/kestrel-mywebapp
server {
# ... listen, server_name, etc.
location / {
# --- قبل ---
# proxy_pass http://localhost:5000;
# --- بعد ---
# کلمه کلیدی unix: به Nginx میگوید که این یک سوکت یونیکس است
proxy_pass http://unix:/var/run/kestrel-mywebapp.sock;
# سایر هدرها دستنخورده باقی میمانند
proxy_set_header Host $host;
# ...
}
}http:// همچنان ضروری است. این به Nginx میگوید که پروتکل مورد استفاده روی این کانال ارتباطی، HTTP است..sock را ایجاد کند. کاربر Nginx (که معمولاً www-data است) باید بتواند در این فایل بنویسد و بخواند./var/run با chmod 777. (این کار بسیار ناامن است!)systemd برای مدیریت دسترسیهاsystemd خود را هوشمندتر کنیم تا قبل از اجرای برنامه، پوشه لازم را با دسترسیهای صحیح ایجاد کند./etc/systemd/system/kestrel-mywebapp.service را به شکل زیر ویرایش کنید:[Unit] Description=My Awesome ASP.NET Core Web App [Service] WorkingDirectory=/var/www/mywebapp ExecStart=/usr/bin/dotnet /var/www/mywebapp/MyWebApp.dll # ... Restart, KillSignal, etc. # این خطوط کلیدی هستند User=www-data Group=www-data # systemd یک پوشه در /run برای ما ایجاد میکند RuntimeDirectory=kestrel-mywebapp # دسترسی را طوری تنظیم میکند که کاربر و گروه (www-data) اجازه کامل داشته باشند RuntimeDirectoryMode=0770 # ... Environment variables [Install] WantedBy=multi-user.target
Program.cs مسیر سوکت را به این پوشه جدید تغییر دهید:options.ListenUnixSocket($"/run/kestrel-mywebapp/mywebapp.sock");
systemd پوشه /run/kestrel-mywebapp را با مالکیت www-data:www-data و دسترسی rwxrwx--- ایجاد میکند.www-data اجرا شده و فایل سوکت را داخل این پوشه امن ایجاد میکند.www-data اجرا میشود، به راحتی به این سوکت دسترسی دارد.sudo systemctl daemon-reload sudo systemctl restart kestrel-mywebapp.service sudo systemctl restart nginx
| ویژگی | پورت TCP (localhost:port) | سوکت یونیکس (unix:/path.sock) |
| سادگی | ✅ بسیار ساده | ⚠️ کمی پیچیدهتر (نیازمند مدیریت دسترسی) |
| عملکرد | خوب | ✅ کمی بهتر (در ترافیک بالا) |
| امنیت | قابل قبول (با فایروال) | ✅ بسیار امن (با دسترسیهای فایل سیستم) |
| اشغال پورت | بله | ✅ خیر |
| عیبیابی | ساده (curl localhost:5000) | نیازمند دستور خاص (curl --unix-socket) |