ওপেনসেল ১.০.২ সহ ডিবিয়ান জেসি এনগিনেক্স এনপিএন এর পরিবর্তে ALPN ব্যবহার করতে


14

আমি আমার সার্ভারে ডেবিয়ান জেসি চালাচ্ছি এবং সম্প্রতি http / 2 সমর্থন (এনগিনেক্স 1.10) সহ নতুন এনগিনেক্স ওয়েব সার্ভারে আপগ্রেড করেছি। আজকের মতো, এটি দুর্দান্ত কাজ করে এবং ওয়েবসভারটি HT2 প্রোটোকল সহ সামগ্রী সরবরাহ করে।

আমি পড়েছি, সেই ক্রোম এনপিএন সমর্থন ছাড়ছে এবং কেবলমাত্র 15.5.2016 এর পরে ALPN কে অনুমতি দেয়। ALPN এক্সটেনশন, যার জন্য ওপেনসেল ১.০.২ ইনস্টল করা প্রয়োজন, তবে ডেবিয়ান জেসিতে কেবল ওপেনসেল ১.০.১ থাকে (এছাড়াও ডেবিয়ান ব্যাকপোর্ট এবং অন্য সংগ্রহস্থলগুলিতে, এই ডিবিয়ানটির জন্য কোনও ওপেনসেল 1.0.2 সংস্করণ নেই)।

এবং সমস্যাটি আছে - আমি এসপিডিওয়াই থেকে এইচটিপি 2 তে আপগ্রেড করেছি এবং কয়েক দিনের মধ্যে, আমাকে HT2 বন্ধ করতে হবে এবং এসপিডিওয়াই ব্যবহার করতে পারবেন না কারণ নিগেক্সের এই সংস্করণটিতে কেবল http2 রয়েছে। আমি আরও পড়েছি, এই ডেবিয়ান সংস্করণটি ওপেনসেল ১.০.১ এর সাথে আটকে থাকবে এবং কেবলমাত্র ডেবিয়ান প্রসারিতটিতে ওপেনসেল ১.০.২ থাকবে। তবে মুক্তির তারিখটি প্রায় বছর রয়েছে এবং ক্রোম শীঘ্রই সমর্থন ছেড়ে দিবে, তাই আমি http2 প্রোটোকলের সুবিধাটি ছাড়তে চাই না।

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

কোন সাহায্যের জন্য ধন্যবাদ।


আপনি ব্যবহার apt pinningএবং opensslবাইরে ব্যবহার করতে পারে Debian stretch
gf_

@gf_ আপনার সিস্টেমটি ভঙ্গ করার খুব উচ্চ ঝুঁকিতে। অনেক কিছুই ওপেনএসএসএলে নির্ভর করে।
মাইকেল হ্যাম্পটন

@ মিশেলহ্যাম্পটন ভাল, আমি ঝুঁকির স্তর সম্পর্কে বিচার করতে পারি না, সন্দেহ করি এটি খুব বেশি। আমি অন্যতম রক্ষণাবেক্ষণকারী কার্ট রোকেেক্সের সাথে যাচ্ছি, যিনি ফ্রিজে যাওয়ার খুব শীঘ্রই 1.0.2প্রবেশ করার চেষ্টা করেছিলেন jessie(যা তখন প্রত্যাখ্যান করা হয়েছিল): "এই সংস্করণটি 1.0.1 সংস্করণের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত। আমি কিছুই আশা করি না 1.0.1 থেকে 1.0.2 এ চলন্ত বিরতিতে " (আমি আরও সচেতন হতে হবে libc6।)
gf_

@gf_ "এই প্রসঙ্গে" এর প্রসঙ্গে ওপেনএসএসএল ব্যবহার করা সমস্ত কিছু পুনরায় সংযোগের প্রয়োজন হবে। আমি অবাক হইনি যে এটি প্রত্যাখ্যাত হয়েছিল; দেবিয়ান পুরানো এবং স্থিতিশীল পছন্দ করে। আপনার পরামর্শের প্রসঙ্গে, এর অর্থ ওপেনএসএসএল ব্যবহার করা প্রতিটি প্রসারিত প্যাকেজটি টানানো এবং এটি প্রচুর স্টাফ।
মাইকেল হ্যাম্পটন

@ মিশেলহ্যাম্পটন আমি দেবিয়ান নীতিমালা সম্পর্কে যথেষ্ট সচেতন এবং আমিও অবাক হইনি যে এটি আবার প্রত্যাখ্যানিত হয়েছিল (এটি বলতে বা এই ধারণা তৈরি করতে চায় নি)। কিন্তু: (হয়তো আমার বাক্যে কথন ভুল ছিল): এরকম apt-get install -t stretch nginx(ক ভ্যানিলা উপর Debian jessieদিয়ে nginxইনস্টল করা আছে) মধ্যে টান হবে: nginx nginx-common nginx-full libnginx-mod-http-auth-pam libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libssl1.0.2। (এটি দশটি প্যাকেজ ..)
gf_

উত্তর:


16

আপডেট 2016/08/08: nginx মধ্যে jessie-backports(সংস্করণ 1.9.10-1~bpo8+3বিরুদ্ধে নির্মিত হয়েছিল openssl >= 1.0.2~পথ। ALPNএখন কাজ যদি চলমান jessieমাত্র আউট প্যাকেজ প্রয়োজন jessie-backportsএর বৈঠাচালনা আউট প্যাকেজে আর, কোন প্রয়োজন stretch

-

আসল উত্তর: ঠিক আছে, মন্তব্যগুলি অনুসারে এখানে আমার উত্তরটি চলেছে: আমার মতে, আজকের 2016/05/09 হিসাবে এটি সমাধান করার মতো অনেকগুলি উপায় নেই। মূলত আপনার সিস্টেমে একটি আধুনিক পেতে কোনওরকম চেষ্টা করতে হবে nginx, এর বিপরীতে সংকলিত >= openssl 1.0.2~

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

সুতরাং, আসুন এবং এটি চেষ্টা করে দেখুন:

  • Debian stretchআপনার মধ্যে ভান্ডার যোগ করুন apt sources। এর /etc/apt/sources.listজন্য ব্যবহার করবেন না , বরং /etc/apt/sources.list.d/এটি পরিষ্কার রাখার জন্য ভিতরে একটি উত্সর্গীকৃত ফাইলটি ব্যবহার করুন , ব্যক্তিগতভাবে আমি ব্যবহার করছি stretch.list

    এই লাইনগুলি সেখানে রাখুন:

    deb http://httpredir.debian.org/debian/ stretch main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch main contrib non-free
    
    deb http://security.debian.org/ stretch/updates main contrib non-free
    deb-src http://security.debian.org/ stretch/updates main contrib non-free
    
    # stretch-updates, previously known as 'volatile'
    deb http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    
  • আপনি যে প্যাকেজগুলি নির্দিষ্ট করছেন সেগুলি কেবলমাত্র আপনিই টানছেন তা নিশ্চিত করতে অ্যাপ পিনিং সেট আপ করুন Debian stretch। এটির জন্য যে ফাইলটি ব্যবহার করা হবে তা হল /etc/apt/preferencesভিতরে put

    Package: *
    Pin: release n=jessie
    Pin-Priority: 900
    
    Package: * 
    Pin: release a=jessie-backports
    Pin-Priority: 500
    
    Package: *
    Pin: release n=stretch
    Pin-Priority: 100
    

    (আপনার পরিবেশের সাথে মানানসই আপনাকে স্যুট এবং অগ্রাধিকারগুলি পরিবর্তন করতে হতে পারে))

  • প্যাকেজ ক্যাশে আপডেট করতে apt-get update(মাধ্যমে sudo/ হিসাবে root) চালান ।

  • nginxথেকে ইনস্টল করুন Debian stretch: apt-get install -t stretch nginx(এটি sudoহিসাবে / হিসাবে এটি করুন root)। লাভ!

  • আমি আমার মন্তব্য (গুলি) বর্ণিত, এমনকি কম ঝুঁকি জড়িত হিসেবে, আপনি একটি ভালো কিছু ব্যবহার করতে পারে chroot বা মত একটি ধারক-সমাধান LXC । আপনি যদি chrootপথে যেতে চান তবে আপনাকে সেখানে ভিতরে একটি নেটওয়ার্ক ইন্টারফেস সেট আপ করতে হবে: এটি করার জন্য , এই ব্লগপোস্টটি উদাহরণস্বরূপ দেখুন , যা একটি ভূমিকা দেয় network namespaces

  • আশাকরি এটা সাহায্য করবে; আপনি যদি আরও প্রশ্ন পেয়ে থাকেন তবে নির্দ্বিধায় আমার সাথে যোগাযোগ করুন। আমি প্রতিক্রিয়ার প্রশংসা করব এবং আমি কীভাবে এটি যায় তাতে আগ্রহী।


আমি আপনার উত্তরের বিবরণ দিয়ে আজই এনজিএক্স ইনস্টল করেছি এবং সবকিছু দুর্দান্ত কাজ করছে বলে মনে হচ্ছে! কেবলমাত্র আমার অতিরিক্ত করার দরকার ছিল তা ছিল পুরানো এনগিনেক্স ইনস্টলেশন অপসারণ, কারণ আমার এনজিএনক্স সংগ্রহস্থল থেকে এনজিঙ্ক্স ১.১০ ছিল এবং এটি সংস্করণ ডিবিয়ান রিপোজিটরি প্যাকেজের সাথে সামঞ্জস্যপূর্ণ নয় (তবে আমি যখন ডিবিয়ান এনজিনেক্স থেকে আপগ্রেড করছিলাম তখন আমি এটিও করেছি) 1.10 থেকে, তাই এটি কোনও সমস্যা ছিল না)। আপনার প্রচেষ্টা এবং সহায়তার জন্য আপনাকে ধন্যবাদ!
জুরজ নিমেক 15'16

@ জুরজনেমিক গ্রেট! প্রতিক্রিয়া জন্য অনেক ধন্যবাদ! আপনি ALPNইতিমধ্যে সমর্থন জন্য চেক করেছেন ?
gf_

হ্যাঁ. এটিকে HT2 টেস্ট এবং এসএসএল ল্যাবগুলি পরীক্ষার মাধ্যমে চেক করা হয়েছে , উভয়ই বলেছে যে এখানে ALPN সমর্থন রয়েছে। এছাড়াও nginx -Vতথ্য দেয়, যে সংস্করণটি ওপেনসেল 1.0.2+ দিয়ে সংকলিত হয়েছে। সুতরাং আমি মনে করি এটি সঠিকভাবে কাজ করছে।
Juraj Nemec

@ জুরজনেমিক গ্রেট, দুর্দান্ত লাগছে! আপনার পক্ষে যদি সম্ভব হয় তবে আপনি এই সেটআপটি কিছুক্ষণ চালানোর পরে, সম্ভবত চার বা আট সপ্তাহের জন্য একটি ছোট আপডেট পেতে আগ্রহী। ধন্যবাদ!
gf_

@ জুরাজনেমিক এটি দেখে মনে হচ্ছে, গুগল স্যুইচ তৈরি করে এনপিএন সরিয়ে দিয়েছে। আপনার সেটআপটি এখনও প্রত্যাশার মতো কাজ করে?
gf_

11

আর একটি পদ্ধতি হ'ল জেসি-ব্যাকপোর্টগুলি থেকে ওপেনএসএসএল 1.0.2 ইনস্টল করা এবং উবুন্টু 16.04 এলটিএস এনজিঙ্কসের নিজস্ব সংগ্রহস্থল থেকে বিল্ড ব্যবহার করা এইভাবে আপনি জেসির জন্য অন্তত একটি ওপেনএসএসএল প্যাকেজ ব্যবহার করছেন।

এতে যুক্ত করুন /etc/apt/sources.list:

# jessie-backports, from stretch-level but with no dependencies
deb http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian/ jessie-backports main contrib non-free

# Nginx repository - use Ubuntu 16.04 LTS Xenial to get packages compiled with OpenSSL 1.0.2
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

তারপরে চালান:

apt-get update
apt-get install -t jessie-backports openssl
apt-get install nginx

এটি আপনাকে অবশ্যই অফিশিয়ালি অসমর্থিত কনফিগারেশনে রাখে , তবে সম্ভবত প্যাকেজ না রাখাই ভাল - এবং এটি আমার পক্ষে কাজ করে। এছাড়াও, এনগিনেক্সের রেপো ব্যবহারের অর্থ আপনি নতুন আপডেট পান।


আপনি কি দয়া করে বিস্তারিত / স্পষ্ট করে বলতে পারেন যে এই রুটে একজন কেন যাবে? "প্লাস সম্পর্কিত, এনগিনেক্সের রেপো ব্যবহারের অর্থ আপনি নতুন আপডেট পেয়েছেন" ": আমি যেভাবে বর্ণনা করেছি সেভাবে আপনি" নতুন আপডেট "পাচ্ছেন।
gf_

এনগিনেক্সের প্যাকেজগুলি তাদের মুক্তির দিনেই আপডেট হয়েছে, কারণ তারা তাদের রিলিজ প্রক্রিয়ার অংশ, দেবিয়ান প্রকাশের প্রক্রিয়া নয়। আমি মূললাইন প্যাকেজগুলি অন্তর্ভুক্ত করেছি, স্থিতিশীল প্যাকেজগুলি নয়, তবে আপনি উপরের পাথগুলিতে কেবল মুখ্য / মূললাইন সরিয়েই স্থিতিশীল পেতে পারেন। আপনি যা পছন্দ করেন তা আপনার উপর নির্ভর করে।
গ্রিনরাইপার

উপরের অংশে প্রসারিত করতে: প্রসারিত হ'ল বর্তমান 'টেস্টিং' রিলিজ, এবং এটি পরীক্ষার থেকে সরাতে কত সময় নেয় তার ভিত্তিতে সর্বনিম্ন বিলম্ব হয় ; এবং এটি ধরে নিয়েছে যে এটি এটিকে অবিলম্বে অস্থির করে তোলে - উদাহরণস্বরূপ, ১.১০.০ কে ২ 26 এপ্রিল মুক্তি দেওয়া হয়েছিল , তবে অস্থির ২৯ এপ্রিলের দিকে ঠেলে দেওয়া হয় এবং ৫ মে তারিখে প্রসারিত হন ( পিটিএস দেখুন )।
গ্রিনরাইপার

1
আমি এই তথ্যগুলি সম্পর্কে যথেষ্ট সচেতন, ধন্যবাদ। :) আমি মনে করি যদি স্থিতিশীল পরিষেবাদি সরবরাহের চেষ্টা করা হয় তবে কারও "নতুন প্যাকেজ" দরকার (কেবল কারণ (?)) যদি প্রশ্নটি উত্থিত হয়। আফাইক, অনেক লোক দেবিয়ানকে বেছে নেয় (এবং এটি ওএসের প্রশ্ন সম্পর্কেই হয়) কারণ এটি স্থিতিশীল। সফ্টওয়্যারটির নতুন সংস্করণ চালানোতে বেশ কিছু ঝুঁকি রয়েছে। তবে যাইহোক, আমি অনুমান করি যে কীভাবে এটি পরিচালিত হয় তার কোনও সাধারণ নিয়ম নেই, কারণ পরিবেশ, প্রত্যাশা এবং প্রয়োজনগুলি পৃথক। এছাড়াও: আপনার ইনপুটটির জন্য ধন্যবাদ, আমি নিশ্চিত যে এটি মানুষের কাছে মূল্যবান; আমার লাইনগুলি এর আগে কোনও ধরণের অপরাধ বোঝায় না।
gf_

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

0

আরেকটি পদ্ধতি হ'ল জেসি-ব্যাকপোর্টগুলি ব্যবহার করা এবং তারপরে সহজেই এনগিনেক্স পুনর্নির্মাণ করা

/etc/apt/sources.list ব্যাকপোর্টগুলিতে যুক্ত করুন

deb http://ftp.debian.org/debian jessie-backports main

এবং তারপরে রুট হিসাবে চালান

apt-get update
apt-get install -t jessie-backports openssl

এবং তারপরে nginx পুনর্নির্মাণ করুন। Https://wiki.debian.org/ বিল্ডিংপ্যাকেজের নির্দেশাবলী অনুসরণ করুন


"[...] হয় আপনি নিজের জন্য সংকলন করুন, যা আপনি করতে চান না [...]"
জিএফ_

0

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

এই সমাধানটি এইভাবে ধরে নিয়েছে যে আপনি ডকার ইনস্টল করেছেন এবং এটির Alpine Linuxপরিবর্তে এনগিনেক্স চালানো ভাল Debian Jessie

আপনার Nginx ধারক শুরু করতে:

sudo docker run --name nginx-container -p 80:80 -p 443:443 -v /path/to/your/nginx/directory/:/etc/nginx/ /path/to/your/files/to/serve/:/usr/share/nginx/html/ -d nginx:1.11-alpine

আপনাকে ডকার দিয়ে শুরু করার জন্য সংক্ষিপ্ত ব্যাখ্যা:

  • docker run: ডকার চিত্রটি ডাউনলোড করুন (এই ক্ষেত্রে nginx:1.11-alpine) যদি আপনার এটি না থাকে এবং এই চিত্রের উপর ভিত্তি করে ডকার ধারক শুরু করেন
  • --name nginx-container: ডকার কনটেইনারকে একটি নাম দেয় (আপনি থামানো পাত্রে দেখতে সমস্ত চালিত ডকার পাত্রে ব্যবহার sudo docker psকরতে sudo docker ps -aপারেন বা ব্যবহার করতে পারেন)
  • -p 80:80 -p 443:443: আপনার হোস্ট মেশিনে 80 এবং 443 বন্দরগুলি যথাক্রমে ডকার পাত্রে 80 এবং 443 পোর্টগুলিতে আবদ্ধ করে
  • -v /path/to/your/nginx/directory/:/etc/nginx/: আপনার হোস্ট সিস্টেমে ডিরেক্টরিটি মাউন্ট করে যা আপনার Nginx কনফিগারেশনটি /etc/nginx/ডকার পাত্রে ডিরেক্টরিতে অন্তর্ভুক্ত করে
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: আপনার হোস্ট সিস্টেমে একটি ডিরেক্টরি মাউন্ট করে যার মধ্যে আপনি Nginx পরিবেশন করতে চান এমন ফাইল রয়েছে
  • -d: পটভূমিতে ধারকটি শুরু করে (আপনি ব্যবহার করে ধারকটি থামাতে পারেন docker stop nginx-container)
  • nginx:1.11-alpine: আপনার ধারকটি থেকে এটি শুরু করতে এই চিত্রটি ব্যবহার করুন ( সরকারী Nginx ডকার চিত্রগুলি এখানে তালিকাবদ্ধ রয়েছে )

এছাড়াও দরকারী:

  • sudo docker exec nginx-container <command>ধারকটিতে একটি কমান্ড চালানোর জন্য ব্যবহার করুন , উদাহরণস্বরূপ sudo docker exec nginx-container nginx -s reloadআপনি হোস্ট সিস্টেমে কনফিগারেশন ফাইলগুলি পরিবর্তন করার পরে Nginx পুনরায় লোড করুন
  • বা sudo docker exec -it nginx-container bashপাত্রে একটি ব্যাশ শেল প্রবেশ করার জন্য ব্যবহার করুন যাতে আপনি সরাসরি সেখানে কাজ করতে পারেন (প্রস্তাবিত নয়, তবে কখনও কখনও দরকারী)

0

বিকল্প উপায় হ'ল পরিবর্তে বোরিং এসএসএল ব্যবহার করা, যা ওপেনএসএসএল চারপাশে ক্ষতি করে না। এখানে বর্ণিত বিশদগুলি https://www.admon.org/hardwares/enable-http2-support-for-nginx-on-debian-jessie


1
কেবলমাত্র লিঙ্কের উত্তরগুলি লিঙ্কগুলির মেয়াদ শেষ হওয়ার পরে কম সহায়ক হয়ে ওঠে। লিঙ্কযুক্ত পৃষ্ঠার প্রাসঙ্গিক অংশটি আপনার উত্তরে অন্তর্ভুক্ত করুন।
সেন্ডমোরইনফো

0

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

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