এনজিএনএক্স সহ একটি একক পোর্ট ব্যবহার করে HTTP এবং https র অনুরোধগুলি পরিচালনা করা


16

আমি ভাবছিলাম যে nginx একই বন্দরে HTTP এবং https অনুরোধগুলি পরিচালনা করতে সক্ষম কিনা । [*]

এই আমি চেষ্টা করার চেষ্টা করছি। আমি HTTP অনুরোধগুলি পরিচালনা করে একটি ওয়েব সার্ভার (লাইটটিপিডি) চালিয়ে যাচ্ছি, এবং একটি সি প্রোগ্রাম যা https এর মাধ্যমে ডকুমেন্ট গাছের একটি নির্দিষ্ট বিভাগকে পরিবেশন করে। এই দুটি প্রক্রিয়া একই সার্ভারে চলমান।

ফায়ারওয়াল স্তরে, এই সার্ভারে আমার কাছে কেবল একটি পোর্ট ফরওয়ার্ডিং ট্র্যাফিক থাকতে পারে । সুতরাং আমি যা করতে চাই তা হ'ল এই সার্ভারে এনজিনেক্স সেটআপ করা যাতে এটি কোনও একক বন্দরে অনুরোধের জন্য শোনায় এবং তারপরে:

ক) সমস্ত http://myhost.com/ * অনুরোধগুলি পুনঃনির্দেশ করে যাতে তারা লোকালহোস্টে যায়: 8080 (যেখানে লাইটটিপিডি শুনছে)

খ) যদি কোনও ব্যবহারকারী কোনও ইউআরএল দিয়ে উদাহরণস্বরূপ https: // myhost.com/app ব্যবহার করে তবে এটি অনুরোধটি লোকালহোস্ট: 8008 (সি প্রোগ্রাম) প্রেরণ করে। মনে রাখবেন যে এই ক্ষেত্রে, দূরবর্তী ব্রাউজার এবং এনজিনেক্সের মধ্যে ট্র্যাফিক অবশ্যই এনক্রিপ্ট করা উচিত।

আপনি কি মনে করেন এটি সম্ভব হতে পারে? যদি তা হয় তবে কীভাবে এটি করা যায়?

আমি জানি দুটি ভিন্ন বন্দর ব্যবহার করে এটি কীভাবে করা যায়। আমি যে চ্যালেঞ্জের মুখোমুখি হয়েছি এটি কেবল একটি একক বন্দর দিয়ে এটি করছে (দুর্ভাগ্যক্রমে, এই বিশেষ পরিবেশে ফায়ারওয়াল কনফিগারেশনের উপর আমার নিয়ন্ত্রণ নেই, সুতরাং এটি এমন একটি বাধা যা আমি এড়াতে পারি না)। ফায়ারওয়ালকে বাইপাস করতে এসএসএসের মাধ্যমে রিভার্স পোর্ট ফাউর্ডিংয়ের মতো কৌশল ব্যবহার করাও কাজ করবে না, কারণ এটি ওয়েব ব্রাউজার এবং একটি ইন্টারনেট লিঙ্ক ছাড়া আর কিছু না থাকা দূরবর্তী ব্যবহারকারীদের জন্য কাজ করা উচিত।

যদি এটি এনজিনেক্স ক্ষমতার বাইরে থাকে তবে আপনি কি এমন কোনও পণ্য জানেন যা এই প্রয়োজনীয়তাগুলি পূরণ করতে পারে? (এখনও পর্যন্ত আমি লাইটটিপিডি এবং পাউন্ড দিয়ে এটি স্থাপনে ব্যর্থ হয়েছি)। আমি অ্যাপাচি এড়িয়ে চলাও পছন্দ করি (যদিও আমি এটির সম্ভাব্য পছন্দ হলে এটি ব্যবহার করতে চাই)।

অগ্রিম ধন্যবাদ, অ্যালেক্স

[*] কেবল পরিষ্কার করার জন্য, আমি একই বন্দরের মাধ্যমে এনক্রিপ্ট করা এবং এনক্রিপ্ট করা HTTP সংযোগগুলি পরিচালনা করার কথা বলছি । এসএসএল বা টিএলএস এর মাধ্যমে এনক্রিপশন করা হয়েছে কিনা তা বিবেচ্য নয়।


এইচটিটিপিএস অনুরোধগুলি ডিফল্টরূপে 443 পোর্টে যেতে পারে, সুতরাং আপনি এই কাজটি পেতে পারলেও (এবং আমি মনে করি এটি কিছুটা হ্যাকারি দিয়েই সম্ভব) তবে আপনাকে আপনার হোস্ট ডটকম এবং আপনার হোস্ট ডটকম: 80 লিঙ্ক হিসাবে ব্যবহার করতে হবে (বা yourhost.com:443 এবং yourhost.com )।
জাঞ্চে

ঠিক আছে, আমি সার্ভার ফল্ট এ নতুন এবং আমি জানি না আমি নিজের প্রশ্ন মুছতে পারি কিনা। যেহেতু মনে হচ্ছে সমস্যাটি যথেষ্ট পরিমাণে পরিষ্কারভাবে তৈরি করা হয়নি, তার পরিবর্তে আমি একটি নতুন প্রশ্ন খুলব। যাইহোক, এই ইস্যুটির জন্য দরকারী পরামর্শগুলির সাথে যারা অবদান রেখেছেন তাদের সবাইকে অনেক ধন্যবাদ।
আলেমার্টিনি

উত্তর:


18

স্থিতি কোড সম্পর্কিত উইকিপিডিয়া নিবন্ধ অনুসারে, HTTP ট্রাফিক https বন্দরে প্রেরণ করা হলে Nginx এর একটি কাস্টম ত্রুটি কোড রয়েছে (ত্রুটি কোড 497)

এবং ত্রুটি_পৃষ্ঠায় এনজিনেক্স ডক্স অনুসারে আপনি একটি ইউআরআই নির্ধারণ করতে পারেন যা নির্দিষ্ট ত্রুটির জন্য দেখানো হবে।
সুতরাং আমরা একটি ইউরি তৈরি করতে পারি যা ত্রুটি কোড 497 উত্থাপিত হওয়ার সময় ক্লায়েন্টদের পাঠানো হবে।

nginx.conf

#lets assume your IP address is 89.89.89.89 and also that you want nginx to listen on port 7000 and your app is running on port 3000

server {
    listen 7000 ssl;

    ssl_certificate /path/to/ssl_certificate.cer;
    ssl_certificate_key /path/to/ssl_certificate_key.key;
    ssl_client_certificate /path/to/ssl_client_certificate.cer;

    error_page 497 301 =307 https://89.89.89.89:7000$request_uri;

    location / {
        proxy_pass http://89.89.89.89:3000/;

        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Protocol $scheme;
    }
}

তবে যদি কোনও ক্লায়েন্ট কোনও জিইটি ব্যতীত অন্য কোনও পদ্ধতির মাধ্যমে অনুরোধ করে তবে সেই অনুরোধটি জিইটি-তে পরিণত হবে। এইভাবে ক্লায়েন্টের মাধ্যমে আসা অনুরোধ পদ্ধতিটি সংরক্ষণ করার জন্য; আমরা ত্রুটি_পৃষ্ঠাতে এনজিনেক্স ডক্সে দেখানো হয়েছে তেমন ত্রুটি পুনর্নির্দেশগুলি ব্যবহার করি

এবং কেন আমরা 301 =307পুনর্নির্দেশটি ব্যবহার করি তা জানায় ।

এখানে প্রদর্শিত nginx.conf ফাইলটি ব্যবহার করে, আমরা একই বন্দরে HTTP এবং https শুনতে সক্ষম হয়েছি


17

যারা অনুসন্ধান করছেন তাদের জন্য:

আপনার সার্ভার সংজ্ঞা ssl on;এবং যোগ করুন error_page 497 $request_uri;


8
HoverHells সামান্য উন্নতি আরয যোগ ssl on;এবং error_page 497 =200 $request_uri;আপনার সার্ভারে সংজ্ঞা। এটি স্থিতি কোডটি 200 এ পরিবর্তন করবে
Mawi12345

এই পরিবেশন ত্রুটি উত্তর ব্যাখ্যা করে যে এই সমাধান কেন কাজ করে।
সিলিকনমাইন্ড

4

আপনি যদি সত্যই চতুর হতে চেয়েছিলেন, আপনি আগত ডাটা স্ট্রিমের প্রথম কয়েক বাইট স্নিগ্ধ করতে একটি সংযোগ প্রক্সি জিনিসটি ব্যবহার করতে পারেন এবং বাইট 0 এর বিষয়বস্তুর উপর ভিত্তি করে সংযোগটি বন্ধ করতে পারেন: যদি এটি 0x16 হয় (এসএসএল / টিএলএস ' হ্যান্ডশেক 'বাইট), এসএসএল দিকের সাথে সংযোগটি পাস করুন, যদি এটি বর্ণানুক্রমিক অক্ষর হয়, তবে সাধারণ HTTP করুন। পোর্ট নম্বর সম্পর্কে আমার মন্তব্য প্রযোজ্য


2

হ্যাঁ, এটি সম্ভব, তবে এনজিনেক্স উত্স কোডটি প্যাচিং করা দরকার (হোভারহেলের প্যাচিং ছাড়াই সমাধান রয়েছে)। এনগিনেক্স এটিকে বৈধ কনফিগারেশন হিসাবে বৈধ কনফিগারেশন হিসাবে বিবেচনা করে।

চলক s ssl_session_id প্লেইন এবং এসএসএল সংযোগের মধ্যে পার্থক্য করতে ব্যবহার করা যেতে পারে।

Nginx-0.7.65 এর বিরুদ্ধে প্যাচ:

--- src/http/ngx_http_request.c-orig    2011-05-03 15:47:09.000000000 +0200
+++ src/http/ngx_http_request.c 2011-05-03 15:44:01.000000000 +0200
@@ -1545,12 +1545,14 @@

    c = r->connection;

+    /* disable plain http over https port warning
     if (r->plain_http) {
         ngx_log_error(NGX_LOG_INFO, c->log, 0,
                       "client sent plain HTTP request to HTTPS port");
         ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS);
         return;
     }
+    */

#if (NGX_HTTP_SSL)

সার্ভার কনফিগারেশন:

server {
    listen 80;
    index index.html;

    location / {
        root html;
        if ($ssl_session_id) {
            root html_ssl;
        }
    }

    ssl on;
    ssl_certificate cert.crt;
    ssl_certificate_key cert.key;
}

1

আমি মনে করি না যে এমন কিছু আছে যা একটি একক বন্দরে দুটি আলাদা প্রোটোকল পরিচালনা করতে পারে ...

আপনি কেন কেবল একটি বন্দর ফরওয়ার্ড করতে পারবেন তা সম্পর্কে আমি কৌতূহল বোধ করি তবে এটি একদিকে ... এটি আদর্শ নয় তবে যদি আমি আপনার জুতোতে থাকি তবে আমি https- র মাধ্যমে সমস্ত কিছু পরিবেশন করতাম।


হাই উইল, এবং আপনার উত্তরের জন্য ধন্যবাদ! আমি মনে করি যে https- র মাধ্যমে সমস্ত কিছু পরিবেশন করা একটি বিকল্প হতে পারে, যদিও আমি যেভাবে বর্ণনা করেছি সেভাবে এটি সেট আপ করতে সক্ষম হতে চাই। সামনের ওয়েব সার্ভার (বিপরীত প্রক্সি হিসাবে অভিনয় করা) একটি সাধারণ http সেশন স্থাপন করতে পারে এবং তারপরে পোর্ট পরিবর্তন না করে এটিকে https এ আপগ্রেড করতে পারলে এটি করা যেতে পারে। আমি মনে করি যে এই আচরণটি বর্ণিত হয়েছে RFC2817 (এইচটিটিপি / 1.1 সহ টিএলএসে আপগ্রেড করা) তবে আমি নিশ্চিত ননজিনেক্স বা অন্যান্য ওয়েব সার্ভারগুলি কীভাবে সেই মানটির সাথে আচরণ করতে হয় তা জানেন কিনা।
আলেমার্টিনি

আমার কাছে পুরো আরএফসি পড়ার মতো সময় নেই (এবং এটি বুঝতে আমি যথেষ্ট বুদ্ধিমান নই!) তবে আপনি কি সুরক্ষিত অধিবেশন প্রতিষ্ঠিত হওয়ার আগে বা পুরো উত্থিত বিভিন্ন অধিবেশনগুলির আগে আদর্শ আলোচনার বিষয়ে কথা বলছেন? আমি মনে করি আমি আরও কিছুটা বুঝতে পেরেছি - সার্ভারটি দুটি পোর্টে পরিবেশন করছে এবং এটিই প্রক্সি যা অনুরোধটিকে উল্লেখ করে - দুর্দান্ত শোনাচ্ছে তবে আমি এটি কখনও দেখিনি seen সম্ভবত কোনও সমাধান কোনও পোর্টে একটি একক সুরক্ষিত সাইট তৈরি করে এবং সম্পূর্ণ ভার্চুয়াল ডিরেক্টরি থাকতে পারে যা অন্য ওয়েবসাইটকে উত্তরাধিকার সূত্রে / আমদানি করে? এটি সমস্ত ইস্যুতে উঠে আসে না, তবে কেবল কাজ করতে পারে: এস
উইলিয়াম হিলসুম

1

আপনি একই বন্দরের উপরে এইচটিটিপি এবং এইচটিটিপিএস উভয়কেই সমর্থন করতে পারবেন না, কারণ সংযোগের উভয় প্রান্তই একটি নির্দিষ্ট ভাষায় কথা বলার প্রত্যাশা করে এবং অন্য প্রান্তটি অন্য কিছু বলছে তবে তারা যথেষ্ট চালাক নয়।

উইলের উত্তরের মতামত হিসাবে আপনি মন্তব্য করেছেন, আপনি টিএলএস আপগ্রেড ব্যবহার করতে পারেন (আমি বিশ্বাস করি যে নতুন এনগিনেক্স এটি সমর্থন করে, যদিও আমি চেষ্টা করি নি), তবে এটি এইচটিটিপি এবং এইচটিটিপিএস চালাচ্ছে না, এটি কেবল টিএলএস আপগ্রেডের সাথে এইচটিটিপি চালাচ্ছে। সমস্যাটি এখনও ব্রাউজার সমর্থন - বেশিরভাগ ব্রাউজারগুলি (এখনও) এটি সমর্থন করে না। আপনি যদি ক্লায়েন্টদের একটি সীমাবদ্ধ পুল পেয়ে থাকেন তবে তবে এটি একটি সম্ভাবনা।


1
এনক্রিপ্ট করা এবং এনক্রিপ্ট করা HTTP ট্র্যাফিক একক বন্দরের মাধ্যমে পরিচালনা করা যায়। আমি যা জানতে চাই তা হ'ল এনজিনেক্স বা অন্যান্য পণ্য (যেমন লাইটটিপিডি) ব্যবহার করে বিপরীত প্রক্সি হিসাবে কাজ করা সম্ভব। বেশ সম্ভবত এই ধরণের সেটআপটি আপাচি দ্বারা পরিচালিত হতে পারে, তবে আমি আমার মূল প্রশ্নে উল্লেখ করতে ভুলে গেছি যে আমি বরং অ্যাপাচি ব্যবহার না করাই পছন্দ করি (যদিও আমি লিনাক্সে অন্য কোনও পছন্দ না থাকলে এটি করব) এটি সম্পাদন করার জন্য প্ল্যাটফর্ম)।
আলেমার্টিনি

যেমনটি আমি আমার উত্তরে বলেছিলাম, "আমি বিশ্বাস করি যে নতুন এনজিএনেক্স রিলিজ সমর্থন [টিএলএস আপগ্রেড], যদিও আমি চেষ্টা করি নি"। আপনার যদি আমার জন্য ম্যানুয়ালটি পড়ার দরকার হয় তবে আপনার ভাগ্য নেই।
দোলা

আমি যদি অনুভূতিটি দিয়ে থাকি যে আমার জন্য কোনও ম্যানুয়াল পড়ার জন্য আমার কারওর দরকার আছে তবে আমি দুঃখিত। এটি কেবল মনে হয় যে সমস্যাটি (এবং এটি সম্পর্কে প্রশ্নগুলি) যথেষ্ট পরিমাণে বর্ণনা করা হয়নি (আমার ভুল), যা আমি জিজ্ঞাসা করছি বা প্রয়োজনীয় ছিল তার বিভিন্ন ব্যাখ্যা করে leading সুতরাং আমি এই সমস্যাটি সম্পর্কে একটি নতুন প্রশ্ন খোলার সিদ্ধান্ত নিয়েছি এবং সমস্যা বা এটি সম্পর্কিত নির্দিষ্ট প্রশ্নগুলির ক্ষেত্রে কোনও সম্ভাব্য বিভ্রান্তি এড়াতে চেষ্টা করব। যাইহোক, আপনার সময় এবং আপনার অন্তর্দৃষ্টি ভাগ করে নেওয়ার জন্য ধন্যবাদ।
alemartini

0

আমি নিশ্চিত না যে এটি কীভাবে এটি টেনে তুলবে, তবে সিইউপিএসডি http৩১ বন্দরে HTTP এবং https উভয়কেই সাড়া দেয় n এনজিঙ্কস এখন যদি এটি করতে না পারে তবে সম্ভবত তারা সিআইপিএস দল কীভাবে এটি টানবে তা থেকে শিখতে পারে, তবে সিইপিএস এর অধীনে রয়েছে জিপিএল, সুতরাং এনগিনেক্সকে এই লাইসেন্সটি পরিবর্তন করতে হবে যদি তারা এই ধরনের সক্ষমতা প্রয়োগ করতে চান এবং অন্য কোথাও কোডটি খুঁজে না পান।


0

তাত্ত্বিকভাবে, আপনার কাছে এমন একটি ওয়েব পৃষ্ঠা থাকতে পারে যা HTTP- র মাধ্যমে অ্যাক্সেসযোগ্য, যা https: 443 এ এটি যে কোনও জায়গায় চাইলে একটি ওয়েবসকেট খুলতে সক্ষম । ওয়েবসকেটের প্রাথমিক হ্যান্ডশেকটি এইচটিটিপি TP সুতরাং, হ্যাঁ, একটি সুরক্ষিত পৃষ্ঠার সুরক্ষিত যোগাযোগের পক্ষে সক্ষম করে তোলা সম্ভব। আপনি নেটটি লাইব্রেরি দিয়ে এটি করতে পারেন ।


0

শেষ পর্যন্ত সঠিকভাবে করা সম্ভব 1.15.2। তথ্য এখানে দেখুন

আপনার nginx.conf এ এই জাতীয় একটি ব্লক যুক্ত করুন (HTTP ব্লকের বাইরে):

stream {
    upstream http {
        server localhost:8000;
    }

    upstream https {
        server localhost:8001;
    }

    map $ssl_preread_protocol $upstream {
        default https;
        "" http;
    }

    server {
        listen 8080;
        listen [::]:8080;
        proxy_pass $upstream;
        ssl_preread on;
    }
}

তারপরে আপনি আপনার সাধারণ সার্ভার ব্লক তৈরি করতে পারেন তবে এই বিভিন্ন পোর্টে শুনছেন:

server {
    listen 8000;
    listen [::]:8000;
    listen 8001 ssl;
    listen [::]:8001 ssl;
...

এইভাবে, স্ট্রিম ব্লকটি টিএলএস কিনা তা প্রিন্ট এবং সনাক্ত করতে সক্ষম হয় (উদাহরণস্বরূপ 8080 পোর্টে) এবং তারপরে প্রক্সি এটি স্থানীয়ভাবে সঠিক সার্ভার পোর্টে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.