reverse proxy on nginx for x-ui
MalKeMitمهم:
۱) اگر با هر روشی بر روی سرور خود دامنه ست کردید این روش برای شما کاربرد ندارد! صرفا در صورتی که از پنل خود با ای پی کار می کنید از این روش استفاده کنید
۲) در این روش از tls استفاده می شود و تمامی ارتباط ها چه از کلاینت تا cdn و چه از cdn تا سرور شما امن هست.(ضمن اینکه میتوان پروفایل های بدون tls که از خود پنل دریافت میکنید را نیز استفاده کنید)
۳) در این روش شما می توانید سایت خودتان را نیز داشته باشید. یعنی می توانید یک سایت ورد پرسی (یا به هر زبان یا فریم ورک دیگری) را برای دامنه خود فعال کنید و کنار آن در مسیر هایی که تعریف کردید ترافیک های vpn نیز عبور بدهید (درواقع ترافیک ها گم می شود و فعالیت vpn مخفی تر خواهد بود)
۴) در صورتی که میخواهید بدون cdn و فقط برای ip فوروارد داشته باشید از مراحل ب و پ و ت عبور کنید و صرفا nginx و x-ui نصب کنید و مرحله چ را دنبال کنید تا برای کانفیگ default تنظیمات reverse proxy را ست کنید (بخش ج هم برای ساخت پروفایل برای وقتی هست که از cdn استفاده میکنید و از این بخش هم عبور کنید)
نیازمندی ها:
۱) برای انجام این روش شما به یک vps و یک دامنه و یک cdn نیاز دارید. (بهتر است از cdn کلادفلر استفاده کنید ولی در صورتی که نیاز به دور زدن نت ملی دارید می توانید از cdn های داخلی استفاده کنید)
۲) وقتی دامنه خود را در cdn ثبت کنید به شما دو نیم سرور(ns) می دهد. از هرجایی که دامنه خریدید، در بخش مدیریت نیم سرور ها (ns) نیم سرور ها رو تغییر بدید و ذخیره کنید. فرآیند ثبت نهایی حداقل چند ساعت طول میکشد
۳) در پنل cdn خود در بخش رکورد های dns یک رکورد باید اضافه کنید. رکورد شما برای ایجاد یک اتصال میان دامنه شما و ای پی شما کاربرد دارد. نوع آن (type) باید A باشد و عنوان آن (name) برابر با @ باشد و نشانی ip آن (IPv4 address) برابربا آی پی سرور شما باید باشد. برای اینکه روی سرور خودتان ssl نصب کنید، باید حالت پراکسی را غیر فعال کنید (یعنی ابر را خاموش کنید) و در نهایت آن را ذخیره کنید(save)

الف) نصب nginx :
۱) ابتدا باید وارد سرورتان بشید، برای این کار باید ssh بزنید. در ویندوز میتوانید از برنامه putty ویا mobaXterm ویا هر برنامه ایی که برای این کار هست استفاده کنید. یوزرنیم شما root خواهد بود و مقدار آی پی را وارد کنید.( ضمنا پورت پیش فرض 22 می باشد)
۲) قبل از نصب بهتر است یک بار سرور را اپدیت کنید (گاها در سرور هایی که تازه خریدید پکیج های زیادی باید اپدیت بشود مثل ssh و... آپدیت کردن پکیج ها مشکلی ایجاد نمی کند) برای این کار ابتدا دستور
apt update
بزنید و بعد از به اتمام رسیدن آن رو دستور
apt upgrade -y
بزنید.
۳) بعد از آپدیت شدن سرور باید nginx و certbot و اکستنشن مربوطه رو نصب کنید برای این کار دستور زیر را بزنید:
sudo apt install nginx certbot python3-certbot-nginx -y
۴) در صورتی که nginx با موفقیت نصب بشود، با زدن ای پی خودتان در مرورگر باید صفحه اولیه nginx را ببینید

ب) پارک کردن دامنه در nginx:
۱) برای پارک دامنه باید تنظیمات دیفالت nginx را کپی کنید و برای دامنه خود تنظیم کنید. با دستور cp میتوانید کپی کنید و بهتر است اسم آن را برابر با اسم دامنه خودتان قرار بدین (به عنوان مثال example.com):
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
۲) تنظیمی که کپی کردین باید به لیست تنظیماتی که nginx آن را فرا میخواند اضافه کنیم، برای این کار از دستور ln استفاده می کنیم (به جای example.com دامنه خود را وارد کنید):
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
در واقع دایرکتوری sites-available شامل کانفیگ های موجود می باشد و دایرکتوری sites-enabled شامل کانفیگ هایی می باشد که فعال شده اند و nginx آن را فراخوانی می کند
دستور ln در واقع shortcut میسازد (از دستور کپی استفاده نکنید) در صورتی که shortcut بسازید با تغییر فایل اصلی، بقیه هم تغییر رو نمایش می دهند
نکته: با این دستور چک کنید که کانفیگ شما در لیست کافیگ های فعال nginx قرار گرفته باشد:
cd /etc/nginx/sites-enabled && ls -la
با زدن این دستور باید با همچین چیزی رو به رو بشیم:

۳) فایل کانفیگی که برای دامنه خود کپی کردید را باز کنید:
nano /etc/nginx/sites-available/example.com
۴) تغییرات زیر را باید اعمال کنید. کانفیگ اولیه به شکل زیر خواهد بود:

در بلوک server {} باید تغییرات خودرا اعمال کنید:
اول مقدار default_server را از دو لاین listen 80 و listen [::]:80 پاک کنید
نکته: مقدارdefault_server برای وقتی کاربرد دارد که nginx دامنه ایی برای ریکوئست پیدا نمی کند، آن بلوک را فراخوانی کند در واقع default سرور می باشد و فقط یک بلوک میتواند دیفالت باشد و چون ما کانفیگ default داریم، بقیه کانفیگ ها نباید این مقدار را داشته باشند
دوم باید نام دامنه خود را وارد کنید در خط server_name مقدار _ را پاک کنید و به جای آن نام دامنه خود را وارد کنید یعنی:
server_name example.com;
در نهایت تنظیمات شما این شکلی می شود:

پ) ایجاد reverse proxy:
۱) در قدم بعدی باید بخش reverse proxy را تنظیم کنید. با توجه به اینکه در پنل x-ui برای هر کاربر پورت متفاوت تعریف شده است و ما میخواهیم فقط از پورت ۴۴۳ استفاده کنیم، باید به وسیله path پورت هر کاربر را به nginx بدهیم تا به صورت اتوماتیک به آن پورت ارسال کند یعنی فرضا مسیر اگر 54321 باشد به پورت 54321 اطلاعات را ارسال کند. برای این کار در زیر بلوک location یک بلوک جدید باز میکنیم:

برای لوکیشن جدید یک prefix اولیه تعریف میکنیم که میتواند دلخواد باشد مثلا من downloader تعریف کردم. در ادامه در بلوک آن این کد را وارد می کنیم:
location /downloader {
if ($http_upgrade != "websocket") {
return 404;
}
location ~ /downloader/\d\d\d\d\d$ {
if ($request_uri ~* "([^/]*$)" ) {
set $port $1;
}
proxy_redirect off;
proxy_pass http://127.0.0.1:$port/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
return 404;
}
تا به همچین کدی برسیم:

در واقع به آزادی هر مسیر downloader/12345 ترافیک را به پورت 12345 ارسال میکند (البته به لوکال هاست و نیازی به هیچ تنظیمات امنیتی در پنل ها نیست چون درون سروری ترافیک منتقل می شود)
۲) برای سیو کردن میتوانید با زدن ctrl + o و و برای خروج پس از آن ctrl + x بزنید
۳) با دستور زیر nginx ری استارت کنید:
systemctl restart nginx
در صورتی که مشکلی نباشد، اروری نمایش نمی دهد.
نکته : قبل از اعمال این کانفیگ با زدن دامنه (در صورتی که رکورد A ست شده باشد) صفحه ولکام nginx را نمایش می دهد(در واقع دیفالت اجرا می شود)
ت) نصب ssl:
۱) ابتدا چک کنید که در cdn رکورد A موجود باشد که به آی پی شما اشاره میکند و همچنین ابر غیر فعال باشد و وقتی دامنه خود را در مرورگر میزنید صفحه ولکام nginx بیاید (شاید به خاطر عدم وجود ssl ارور مشاهده شود) ضمنا در بخش ssl ارتباط cdn با سرور خودتان را http بزارید (در کلادفلر flexible بزنید)
۲) با دستور زیر برای دامنه خود ssl نصب کنید( دامنه فرضی example.com):
certbot --nginx -d example.com --register-unsafely-without-email
۳) در صورتی که با متن تایید قوانین رو به رو شدید مقدار A را وارد کنید

۴) در نهایت از شما بابت ریدایرکت کردن پورت ۸۰ (ریکوئست http ) سوال می پرسد که بهتر هست ریدایرکت شود (مقدار 2)

۵) دامنه شما تنظیم شده است، در پنل کلادفلر حالت پراکسی را فعال کنید و در بخش ssl رو حالت full قرار بدید
ث) نصب x-ui:
نکته: اگر از قبل پنل ران شده دارید و برای آن دامنه ثبت نکردید، میتوانید از این روش استفاده کنید. چون این روش به کانفیگ های شما کاری ندارد
نکته: اگر پنل دیگری مد نظر دارید مشکلی ندارین صرفا باید به صورت ip بدون دامنه و tls کانفیگ داشته باشید (در این روش مدیریت tls به وسیله خود nginx انجام میشود نه xray)
۱) با دستور زیر پنل را نصب کنید:
bash <(curl -Ls https://raw.githubusercontent.com/FranzKafkaYu/x-ui/master/install_en.sh)
۲) بعد از زدن دستور و دانلود پیش نیاز، اجازه نصب میخواهد که با زدن y به آن دسترسی می دهیم و در ادامه username و password و همچنین پورتی که میخوایم پنل در آن بالا باشد را می نویسیم
ج) ساخت پروفایل برای کاربر:
۱) مطابق همیشه برای هر کاربر پروفایل بسازید! با این روش محدودیتی در کلاینت هایی که با آیپی وصل هستند نخواهیم داشت (فقط تنظیماتی که tls نخواهد چون ساختار هندلینگ tls متفاوت هست)
۲) برای پروفایلی که میخواهید ویرایش کنید تا از cdn استفاده کند این آیتم ها را باید تغییر دهید:(از v2rayng استفاده شده است بنا به هر کلاینتی که دارید می توانید دستی تنظیم کنید):

به جای address دامنه خود را بزنین و port را کپی کرده و به جای آن 443 بزنین

و در ادامه در request host دامنه خود را بزنین و در path پورت وprefix که تعریف کرده بودید را قرار بدید و همچنین tls را روی tls بزارید

با این روش علاوه بر کانفیگ های خود میتوانید کانفیگ هایی بسازید که با cdn کار میکند
نکته: در صورتی که میخواهید که کانفیگ فقط با cdn کار کند، موقع ساخت پروفایل listen ip را برابر با 127.0.0.1 قرار بدید

چ) تنظیم reverse proxy برای کانفیگ های با آی پی:
۱) اگر بخواین در کانفیگ های با آی پی به جای پورت ۵ رقمی از یک پورت ثابت مثلا ۸۰ استفاده بکنید، میتوانید از این روش استفاده بکنید، اول باید کانفیگ defualt وب سرور nginx را باز کنید:
nano /etc/nginx/sites-available/default
۲) در بلوک server {} باید تغییرات خودرا اعمال کنید. برای لوکیشن جدید یک prefix اولیه تعریف می کنیم که میتواند دلخواد باشد مثلا من downloader تعریف کردم. در ادامه در بلوک آن این کد را وارد می کنیم:
if ($http_upgrade != "websocket") {
return 404;
}
location ~ /downloader/\d\d\d\d\d$ {
if ($request_uri ~* "([^/]*$)" ) {
set $port $1;
}
proxy_redirect off;
proxy_pass http://127.0.0.1:$port/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
تا به همچین کدی برسیم:

دقت کنید که تغییرات دیگری (مثل server_name و ...) انجام ندید و فقط این بلوک اضافه کنید
۳) با دستور زیر nginx ری استارت کنید:
systemctl restart nginx
۴) در کانفیگ گوشی کاربر، port را از عدد ۵ رقمی به 80 تغییر بدید و فقط در بخش path مسیر را تغییر بدید (مطابق قبل prefix و پورت باید باشد)

