গোলং প্রোডাকশন ওয়েব অ্যাপ্লিকেশন কনফিগারেশন


120

আপনারা যারা প্রযোজনায় গো ব্যাকএন্ড চালাচ্ছেন তাদের জন্য:

গো ওয়েব অ্যাপ্লিকেশন চালানোর জন্য আপনার স্ট্যাক / কনফিগারেশন কী?

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

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

আরও নিবিড় উত্পাদন সেটআপ আছে?

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


3
"মেশিনটি পুনরায় চালু করা হলে (অতিরিক্ত কনফিগারেশন স্ক্রিপ্ট ছাড়াই) সার্ভারটি স্বয়ংক্রিয়ভাবে পুনরায় চালু হবে না" " আমি মনে করি না এটি করা যেতে পারে। আদর্শভাবে আপনি পরিষেবাটির জন্য init / systemd / upstart স্ক্রিপ্ট তৈরি করেছেন। কোনও ইউনিক্স ডেমনকে নিয়ন্ত্রণ করার জন্য এটিই প্রস্তাবিত উপায়।
ইন্টারমারনেট

তুমি সঠিক. আমি অনুমান করি যে আমি এটি অ্যাপাচি-এর মতো একটি সার্ভারের সাথে বিপরীতে বোঝাতে চাইছি যা স্বয়ংক্রিয়ভাবে ইনস্টল করার সময় এই বৈশিষ্ট্যগুলি সেট আপ করে।
চেসেফ

উত্তর:


134

গো প্রোগ্রামগুলি 80 পোর্টে শুনতে এবং সরাসরি HTTP অনুরোধগুলি সরবরাহ করতে পারে। পরিবর্তে, আপনি আপনার গো প্রোগ্রামের সামনে একটি বিপরীত প্রক্সি ব্যবহার করতে চাইতে পারেন, যাতে এটি 80 বন্দরটি শুনতে এবং পোর্টে আপনার প্রোগ্রামের সাথে সংযুক্ত হয়, বলুন, 4000. পরবর্তীটি করার অনেক কারণ রয়েছে: চালাতে হবে না আপনার গো প্রোগ্রামটি রুট হিসাবে, একই হোস্টে অন্যান্য ওয়েবসাইট / পরিষেবাদি সরবরাহ করে, এসএসএল সমাপ্তি, লোড ব্যালেন্সিং, লগিং ইত্যাদি

আমি সামনে HAProxy ব্যবহার । যে কোনও বিপরীত প্রক্সি কাজ করতে পারে। এনগিনেক্সও একটি দুর্দান্ত বিকল্প (HAProxy এর চেয়ে অনেক বেশি জনপ্রিয় এবং আরও কিছু করতে সক্ষম)।

আপনি যদি এর ডকুমেন্টেশন ( এইচটিএমএল সংস্করণ ) পড়ে থাকেন তবে কনফিগার করতে HAProxy খুব সহজ easy আমার haproxy.cfgগো প্রকল্পগুলির একটির জন্য আমার সম্পূর্ণ ফাইলটি অনুসরণ করে, যদি আপনার কোনও প্রারম্ভিক পন্টের প্রয়োজন হয়।

global
        log     127.0.0.1       local0
        maxconn 10000
        user    haproxy
        group   haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        timeout connect 5000
        timeout client  50000
        timeout server  50000

frontend http
        bind :80
        acl  is_stats  hdr(host)       -i      hastats.myapp.com
        use_backend    stats   if      is_stats
        default_backend        myapp
        capture        request header Host     len     20
        capture        request header Referer  len     50

backend myapp
        server  main    127.0.0.1:4000

backend stats
       mode     http
       stats    enable
       stats    scope   http
       stats    scope   myapp
       stats    realm   Haproxy\ Statistics
       stats    uri     /
       stats    auth    username:password

এনগিনেক্স আরও সহজ।

পরিষেবা নিয়ন্ত্রণ সম্পর্কিত, আমি সিস্টেম পরিষেবা হিসাবে আমার গো প্রোগ্রামটি চালাই। আমি মনে করি সবাই তা করে। আমার সার্ভার উবুন্টু চালায় তাই এটি আপস্টার্ট ব্যবহার করে। আমি /etc/init/myapp.confআমার প্রোগ্রামটি নিয়ন্ত্রণ করতে এটি আপস্টার্টের জন্য রেখেছি:

start on runlevel [2345]
stop on runlevel [!2345]

chdir /home/myapp/myapp
setgid myapp
setuid myapp
exec ./myapp start 1>>_logs/stdout.log 2>>_logs/stderr.log

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

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

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


9
দুর্দান্ত উত্তর! প্রস্তাবিত বেসিক সেটআপের জন্য প্রয়োজনীয় সমস্ত কিছুর ভাল উদাহরণ।
ইন্টারমনেট

লগ ঘূর্ণন সম্পর্কে আপনি কি করবেন? আমি সুপারভাইজারটি ব্যবহার করার একমাত্র কারণ এটি খুব বেশি তবে যখন খুব বেশি লগিং চলছে তখন তা ভোগে।
ফিরিক্স

@ ফিরিক্স, আমি নিশ্চিত যে আপনি লগ রোটেশন সম্পর্কে একটি ভিন্ন এসও প্রশ্ন খুলতে পারবেন তবে আপনি যদি ইউনিক্সে থাকেন এবং মানক সরঞ্জামগুলি ব্যবহার করতে চান তবে লোগ্রোটেট পরীক্ষা করুন: লিনাক্সকম্যান্ড.অর্গ_মান_পৃষ্ঠাগুলি / লোগ্রোটেট8 . html । এটি বহু পরিচিত পরিষেবা (অ্যাপাচি, ইয়াম, ইত্যাদি) দ্বারা ব্যবহৃত হয় এবং এটি কনফিগার করা মোটামুটি সহজ।
ডুডি পি

গোয়ে আপনার নিজস্ব বিপরীত প্রক্সি তৈরি করা কত সহজ হবে? এটি কি এনজিনেক্স বা হ্যাপ্রোক্সি ব্যবহারের চেয়ে আরও খারাপ ধারণা হবে? মানে গো দুর্দান্ত HTTP / HTTPS / HTTP / 2 সমর্থন নিয়ে আসে।
থোমাসরুতার

58

জন্য nginx:

  • আমার গো অ্যাপ্লিকেশনটিতে HTTP প্রক্সি বিপরীত করুন
  • স্ট্যাটিক ফাইল হ্যান্ডলিং
  • এসএসএল সমাপ্তি
  • HTTP শিরোনাম (ক্যাশে-নিয়ন্ত্রণ, ইত্যাদি)
  • লগগুলি অ্যাক্সেস করুন (এবং সেইজন্য সিস্টেম লগ রোটেশনটি উত্তোলন করুন)
  • পুনর্লিখন (www সালে নগ্ন, HTTP: // থেকে https: //, ইত্যাদি)

এনগিনেক্স এটিকে খুব সহজ করে তোলে এবং আপনি সরাসরি গো ধন্যবাদ থেকে পরিবেশন করতে পারলেও net/http, অনেকটা "চাকা পুনরায় উদ্ভাবন করা" আছে এবং বিশ্বব্যাপী এইচটিটিপি শিরোনামের মতো স্টাফ এমন কিছু বয়লারপ্লেট জড়িত যা আপনি সম্ভবত এড়াতে পারেন।

আমার গো বাইনারি পরিচালনার জন্য সুপারভাইজার । উবুন্টুর আপস্টার্ট (মোস্তফার উল্লেখ অনুসারে) খুব ভাল, তবে আমি সুপারভাইজারকে পছন্দ করি কারণ এটি তুলনামূলকভাবে বিকৃত-অজ্ঞেয়বাদী এবং ভালভাবে নথিভুক্ত।

সুপারভাইজার, আমার জন্য:

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

8

যারা ডিমন হিসাবে চলমান সরল গো অ্যাপ্লিকেশন চান তাদের জন্য আপস্টার্টের পরিবর্তে সিস্টেমেড (অনেকগুলি লিনাক্স ডিস্ট্রো সমর্থিত) ব্যবহার করুন।

একটি পরিষেবা ফাইল তৈরি করুন

touch /etc/systemd/system/my-go-daemon.service

প্রবেশ করান

[Unit]
Description=My Go App

[Service]
Type=simple
WorkingDirectory=/my/go/app/directory
ExecStart=/usr/lib/go run main.go 

[Install]
WantedBy=multi-user.target

তারপরে পরিষেবাটি সক্ষম করুন এবং শুরু করুন

systemctl enable my-go-daemon
systemctl start my-go-daemon
systemctl status my-go-daemon

systemd এর একটি পৃথক জার্নালিং সিস্টেম রয়েছে যা আপনাকে সহজেই ঝামেলা-শ্যুটিংয়ের জন্য লেগ লগগুলি দেয়।


5

আপনি আপনার বাইনারি কোনও সকেটে ইন্টারনেট ডোমেন সুবিধাযুক্ত পোর্টগুলিতে (1024 এর চেয়ে কম পোর্ট সংখ্যা) বাঁধতে পারেন using setcap

setcap 'cap_net_bind_service=+ep' /path/to/binary

  1. এই আদেশটি আরও বাড়ানো দরকার। sudoপ্রয়োজনীয় হিসাবে
  2. আপনার প্রোগ্রামের প্রতিটি নতুন সংস্করণে একটি নতুন বাইনারি তৈরি হবে যার দ্বারা পুনরায় অনুমোদনের প্রয়োজন হবে setcap

setcap ডকুমেন্টেশন

cap_net_bind_service ডকুমেন্টেশন

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