nginx reverse proxy for 2 servers

nginx reverse proxy for 2 servers

MalKeMit

MalKeMit

مهم:

۱) این روش جایگزین iptables برای فوروارد کردن ترافیک می باشد (در بعضی از سرور های ایرانی مثل اینکه iptables عمل نمی کند)

۲) شما می توانید در صورتی که یک سرور داخلی و چند سرور خارجی دارید با این روش ترافیک ها را منتقل کنید (یعنی میتوان تنظیم کرد که مسیر downloader به سرور یک برود و مسیر channel به سرور دو برود)

۳) اگر از پنل هایی که به هر کاربر پورت متفاوت میدهد استفاده می کنید (x-ui) هم می توانید از این روش استفاده کنید

۴) تمامی ترافیک از کلاینت تا سرور ایرانی و از سرور ایرانی تا سرور خارجی همگی رو پورت ۸۰ خواهد بود


الف) نصب x-ui رو سرور خارجی:

۱) با دستور زیر پنل را نصب کنید:

bash <(curl -Ls https://raw.githubusercontent.com/FranzKafkaYu/x-ui/master/install_en.sh)

۲) بعد از زدن دستور و دانلود پیش نیاز، اجازه نصب میخواهد که با زدن y به آن دسترسی می دهیم و در ادامه username و password و همچنین پورتی که میخوایم پنل در آن بالا باشد را می نویسیم


ب) نصب nginx روی سرور(این مرحله برای سرور ایرانی و خارجی مشابه هم هست)

۱) قبل از نصب بهتر است یک بار سرور را اپدیت کنید (گاها در سرور هایی که تازه خریدید پکیج های زیادی باید اپدیت بشود مثل ssh و... آپدیت کردن پکیج ها مشکلی ایجاد نمی کند) برای این کار ابتدا دستور

apt update

بزنید و بعد از به اتمام رسیدن آن رو دستور

apt upgrade -y

بزنید.

۲) بعد از آپدیت شدن سرور باید nginx رو نصب کنید برای این کار دستور زیر را بزنید:

sudo apt install nginx -y

۳) در صورتی که nginx با موفقیت نصب بشود، با زدن ای پی خودتان در مرورگر باید صفحه اولیه nginx را ببینید

پ) تنظیم reverse proxy در سرور خارجی:

۱) ابتدا باید تنظیم کنیم که ترافیک از پورت ۸۰ به پورت های ۵ رقمی پاس داده شود، اول باید کانفیگ defualt وب سرور nginx را باز کنید:

nano /etc/nginx/sites-available/default

۲) در بلوک server {} باید تغییرات خودرا اعمال کنید. برای لوکیشن جدید یک 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;

}

  تا به همچین کدی برسیم:

دقت کنید که تغییرات دیگری (مثل server_name و ...) انجام ندید و فقط این بلوک اضافه کنید

۳) با دستور زیر nginx ری استارت کنید:

systemctl restart nginx

۴) در کانفیگ گوشی کاربر، port را از عدد ۵ رقمی به 80 تغییر بدید و فقط در بخش path مسیر را تغییر بدید (مطابق قبل prefix و پورت باید باشد)


تا اینجا میتوانید هم با پورت ۵ رقمی و هم با پورت ۸۰ به وی پی ان وصل بشید

ت) تنظیم reverse proxy در سرور داخلی:

۱) مطابق مرجله ب nginx نصب کنید

۲) برای اینکه از سرور داخلی ترافیک را به سمت سرور خارجی ارسال کنید،اول باید کانفیگ defualt وب سرور nginx را باز کنید:

nano /etc/nginx/sites-available/default

۳) در بلوک server {} باید تغییرات خودرا اعمال کنید. برای لوکیشن جدید یک 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://1.2.3.4/downloader/$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;

    }        

تا به همچین کدی برسیم:

در واقع مشابه ریورس پراکسی روی سرور خارجی خواهد بود با این تفاوت که در خط

proxy_pass http://1.2.3.4/downloader/$port;

به جای 1.2.3.4 ای پی سرور خارجیتون رو باید قرار بدین


۴) در صورتی که میخواهید از یک سرور ایرانی برای ۲ سرور خارجی استفاده کنید، باید حتما یک prefix دیگری را انتخاب کنید (مثلا برای یک سرور downloader برای دیگری channel و...)

دقت کنید که زیر بلوک location قبلی قرار بدید و در سه خط زیر به جای downloader اسم دوم رو بزنین (ضمنا در سرور خارجی هم به جای downloader از همین اسم استفاده کنید)

location /downloader {

تبدیل بشه به

location /channel {

و

 location ~ /downloader/\d\d\d\d\d$ {

تبدیل بشه به

 location ~ /channel/\d\d\d\d\d$ {

و

proxy_pass http://1.2.3.4/downloader/$port;

تبدیل بشه به

proxy_pass http://1.2.3.4/channel/$port;


در نهایت با همچین کدی رو به رو میشوید:

ضمنا فراموش نکنید که در کانفیگ درون گوشی ای پی ایرانتون رو قرار بدید(port و path هم فراموش نشود!):



Report Page