ملاحظة
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
توضح هذه المقالة كيف يمكن استخدام Caddy كحاوية sidecar في مجموعة حاويات والعمل كوكيل عكسي لتوفير نقطة نهاية HTTPS مدارة تلقائيا لتطبيقك.
Caddy هو خادم ويب قوي وجاهز للمؤسسات مصدر مفتوح مع HTTPS تلقائي مكتوب بلغة Go ويمثل بديلا ل Nginx.
أتمتة الشهادات ممكنة لأن Caddy يدعم ACMEv2 API (RFC 8555) التي تتفاعل مع Let's Encrypt لإصدار الشهادات.
في هذا المثال، يتم عرض حاوية Caddy فقط على المنفذين 80/TCP و443/TCP. يظل التطبيق خلف الوكيل العكسي خاصا. يحدث اتصال الشبكة بين Caddy والتطبيق الخاص بك عبر localhost.
إشعار
هذا يقف على النقيض من اتصال مجموعة الحاوية داخل المعروفة من docker compose، حيث يمكن الرجوع إلى الحاويات بالاسم.
يقوم المثال بتحميل ملف Caddyfile، المطلوب لتكوين الوكيل العكسي، من مشاركة ملف مستضافة على حساب Azure Storage.
إشعار
بالنسبة إلى عمليات نشر الإنتاج، سيرغب معظم المستخدمين في خبز ملف Caddyfile في صورة docker مخصصة استنادا إلى caddy. بهذه الطريقة، ليست هناك حاجة لتحميل الملفات في الحاوية.
المتطلبات الأساسية
استخدم بيئة Bash في Azure Cloud Shell. لمزيد من المعلومات، راجع التشغيل السريع ل Bash في Azure Cloud Shell.
إذا كنت تفضل تشغيل أوامر مرجع CLI محلياً قم بتثبيت CLI Azure. إذا كنت تعمل على نظام تشغيل Windows أو macOS، ففكر في تشغيل Azure CLI في حاوية Docker. لمزيد من المعلومات، راجع كيفية تشغيل Azure CLI في حاوية Docker.
إذا كنت تستخدم تثبيت محلي، يُرجى تسجيل الدخول إلى Azure CLI مستخدمًا أمر az login. لإنهاء عملية المصادقة، اتبع الخطوات المعروضة في جهازك. للحصول على خيارات أخرى لتسجيل دخول، راجع تسجيل الدخول باستخدام Azure CLI.
عندما يُطلب منك، قم بتثبيت ملحق Azure CLI عند الاستخدام لأول مرة. لمزيد من المعلومات بشأن الامتدادات، راجع استخدام امتدادات مع Azure CLI.
يُرجى تشغيل إصدار az للوصول إلى الإصدار والمكتبات التابعة التي تم تثبيتها. للتحديث لآخر إصدار، يُرجى تشغيل تحديث az.
- تتطلب هذه المقالة الإصدار 2.0.55 أو إصدارًا أحدث من Azure CLI. إذا كنت تستخدم Azure Cloud Shell، يتم تثبيت أحدث إصدار بالفعل.
إعداد ملف Caddyfile
إنشاء ملف يسمى Caddyfile
ولصق التكوين التالي. ينشئ هذا التكوين تكوين وكيل عكسي، مشيرا إلى حاوية التطبيق الخاصة بك الاستماع على 5000/TCP.
my-app.westeurope.azurecontainer.io {
reverse_proxy http://localhost:5000
}
من المهم ملاحظة أن التكوين يشير إلى اسم مجال بدلا من عنوان IP. يجب أن يكون Caddy قابلا للوصول من خلال عنوان URL هذا لتنفيذ خطوة التحدي التي يتطلبها بروتوكول ACME واسترداد شهادة بنجاح من Let's Encrypt.
إشعار
لنشر الإنتاج، قد يرغب المستخدمون في استخدام اسم مجال يتحكمون فيه، على سبيل المثال، api.company.com
وإنشاء سجل CNAME يشير إلى على سبيل المثال. my-app.westeurope.azurecontainer.io
إذا كان الأمر كذلك، يجب التأكد من استخدام اسم المجال المخصص أيضا في ملف Caddyfile، بدلا من الاسم الذي تم تعيينه بواسطة Azure (على سبيل المثال، *.westeurope.azurecontainer.io
). علاوة على ذلك، يجب الإشارة إلى اسم المجال المخصص في تكوين ACI YAML الموضح لاحقا في هذا المثال.
إعداد حساب التخزين
إنشاء حساب تخزين
az storage account create \
--name <storage-account> \
--resource-group <resource-group> \
--location westeurope
تخزين سلسلة الاتصال إلى متغير بيئة
AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name <storage-account> --resource-group <resource-group> --output tsv)
إنشاء مشاركات الملفات المطلوبة لتخزين حالة الحاوية وتكوين caddy.
az storage share create \
--name proxy-caddyfile \
--account-name <storage-account>
az storage share create \
--name proxy-config \
--account-name <storage-account>
az storage share create \
--name proxy-data \
--account-name <storage-account>
استرداد مفاتيح حساب التخزين وتدوين ملاحظة لاستخدامها لاحقا
az storage account keys list -g <resource-group> -n <storage-account>
توزيع مجموعة حاوية
إنشاء ملف YAML
إنشاء ملف يسمى ci-my-app.yaml
ولصق المحتوى التالي. تأكد من استبدال <account-key>
بأحد مفاتيح الوصول المستلمة مسبقا <storage-account>
ووفقا لذلك.
يعرف ملف YAML هذا حاويتين reverse-proxy
و my-app
. تركب reverse-proxy
الحاوية مشاركات الملفات الثلاثة التي تم إنشاؤها مسبقا. يعرض التكوين أيضا المنفذ 80/TCP و443/TCP للحاوية reverse-proxy
. يحدث الاتصال بين الحاويتين على المضيف المحلي فقط.
إشعار
من المهم ملاحظة أن dnsNameLabel
المفتاح يعرف اسم DNS العام، والذي بموجبه سيتم الوصول إلى مجموعة مثيل الحاوية، فإنه يحتاج إلى مطابقة FQDN المحدد في Caddyfile
name: ci-my-app
apiVersion: "2021-10-01"
location: westeurope
properties:
containers:
- name: reverse-proxy
properties:
image: caddy:2.6
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
resources:
requests:
memoryInGB: 1.0
cpu: 1.0
limits:
memoryInGB: 1.0
cpu: 1.0
volumeMounts:
- name: proxy-caddyfile
mountPath: /etc/caddy
- name: proxy-data
mountPath: /data
- name: proxy-config
mountPath: /config
- name: my-app
properties:
image: mcr.microsoft.com/azuredocs/aci-helloworld
ports:
- port: 5000
protocol: TCP
environmentVariables:
- name: PORT
value: 5000
resources:
requests:
memoryInGB: 1.0
cpu: 1.0
limits:
memoryInGB: 1.0
cpu: 1.0
ipAddress:
ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
type: Public
dnsNameLabel: my-app
osType: Linux
volumes:
- name: proxy-caddyfile
azureFile:
shareName: proxy-caddyfile
storageAccountName: "<storage-account>"
storageAccountKey: "<account-key>"
- name: proxy-data
azureFile:
shareName: proxy-data
storageAccountName: "<storage-account>"
storageAccountKey: "<account-key>"
- name: proxy-config
azureFile:
shareName: proxy-config
storageAccountName: "<storage-account>"
storageAccountKey: "<account-key>"
انشر مجموعة الحاوية
قم بإنشاء مجموعة موارد باستخدام الأمر az group create :
az group create --name <resource-group> --location westeurope
نشر مجموعة الحاوية باستخدام الأمر az container create مع تمرير ملف YAML كوسطية.
az container create --resource-group <resource-group> --file ci-my-app.yaml
عرض حالة التوزيع
لعرض حالة التوزيع، استخدم الأمر التالي az container show:
az container show --resource-group <resource-group> --name ci-my-app --output table
التحقق من اتصال TLS
قبل التحقق مما إذا كان كل شيء سار على ما يرام، امنح مجموعة الحاوية بعض الوقت للبدء بشكل كامل ولمطالبة Caddy بشهادة.
OpenSSL
يمكننا استخدام s_client
الأمر الفرعي ل OpenSSL لهذا الغرض.
echo "Q" | openssl s_client -connect my-app.westeurope.azurecontainer.io:443
CONNECTED(00000188)
---
Certificate chain
0 s:CN = my-app.westeurope.azurecontainer.io
i:C = US, O = Let's Encrypt, CN = R3
1 s:C = US, O = Let's Encrypt, CN = R3
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1
i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEgTCCA2mgAwIBAgISAxxidSnpH4vVuCZk9UNG/pd2MA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMzA0MDYxODAzMzNaFw0yMzA3MDUxODAzMzJaMC4xLDAqBgNVBAMT
I215LWFwcC53ZXN0ZXVyb3BlLmF6dXJlY29udGFpbmVyLmlvMFkwEwYHKoZIzj0C
AQYIKoZIzj0DAQcDQgAEaaN/wGyFcimM+1O4WzbFgO6vIlXxXqp9vgmLZHpFrNwV
aO8JbaB7hE+M5EAg34LDY80RyHgY+Ff4vTh2Z96rVqOCAl4wggJaMA4GA1UdDwEB
/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/
BAIwADAdBgNVHQ4EFgQUoL5DP+4PWiyE79hL5o+v8uymHdAwHwYDVR0jBBgwFoAU
FC6zF7dYVsuuUAlA5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzAB
hhVodHRwOi8vcjMuby5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9yMy5p
LmxlbmNyLm9yZy8wLgYDVR0RBCcwJYIjbXktYXBwLndlc3RldXJvcGUuYXp1cmVj
b250YWluZXIuaW8wTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEw
KDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEEBgor
BgEEAdZ5AgQCBIH1BIHyAPAAdgC3Pvsk35xNunXyOcW6WPRsXfxCz3qfNcSeHQmB
Je20mQAAAYdX8+CQAAAEAwBHMEUCIQC9Ztqd3DXoJhOIHBW+P7ketGrKlVA6nPZl
9CiOrn6t8gIgXHcrbBqItemndRMv+UJ3DaBfTkYOqECecOJCgLhSYNUAdgDoPtDa
PvUGNTLnVyi8iWvJA9PL0RFr7Otp4Xd9bQa9bgAAAYdX8+CAAAAEAwBHMEUCIBJ1
24z44vKFUOLCi1a7ymVuWErkmLb/GtysvcxILaj0AiEAr49hyKfen4BbSTwC8Fg4
/LgZnn2F3uHI+9p+ZMO9xTAwDQYJKoZIhvcNAQELBQADggEBACqxa21eiW3JrZwk
FHgpd6SxhUeecrYXxFNva1Y6G//q2qCmGeKK3GK+ZGPqDtcoASH5t5ghV4dIT4WU
auVDLFVywXzR8PT6QUu3W8QxU+W7406twBf23qMIgrF8PIWhStI5mn1uCpeqlnf5
HpRaj2f5/5n19pcCZcrRx94G9qhPYdMzuy4mZRhxXRqrpIsabqX3DC2ld8dszCvD
pkV61iuARgm3MIQz1yL/x5Bn4nywjnhYZA4KFktC0Ti55cPRh1mkzGQAsYQDdWrq
dVav+U9dOLQ4Sq4suaDmzDzApr+hpQSJhwgRN16+tLMyZ6INAU2JWKDxiyDTdOuH
jz456og=
-----END CERTIFICATE-----
subject=CN = my-app.westeurope.azurecontainer.io
issuer=C = US, O = Let's Encrypt, CN = R3
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4208 bytes and written 401 bytes
Verification error: unable to get local issuer certificate
---
New, TLSv1.3, Cipher is TLS_AES_128_GCM_SHA256
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 20 (unable to get local issuer certificate)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_128_GCM_SHA256
Session-ID: 85F1A4290F99A0DD28C8CB21EF4269E7016CC5D23485080999A8548057729B24
Session-ID-ctx:
Resumption PSK: 752D438C19A5DBDBF10781F863D5E5D9A8859230968A9EAFFF7BBA86937D004F
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 604800 (seconds)
TLS session ticket:
0000 - 2f 25 98 90 9d 46 9b 01-03 78 db bd 4d 64 b3 a6 /%...F...x..Md..
0010 - 52 c0 7a 8a b6 3d b8 4b-c0 d7 fc 04 e8 63 d4 bb R.z..=.K.....c..
0020 - 15 b3 25 b7 be 64 3d 30-2b d7 dc 7a 1a d1 22 63 ..%..d=0+..z.."c
0030 - 42 30 90 65 6b b5 e1 83-a3 6c 76 c8 f6 ae e9 31 B0.ek....lv....1
0040 - 45 91 33 57 8e 9f 4b 6a-2e 2c 9b f9 87 5f 71 1d E.3W..Kj.,..._q.
0050 - 5a 84 59 50 17 31 1f 62-2b 0e 1e e5 70 03 d9 e9 Z.YP.1.b+...p...
0060 - 50 1c 5d 1f a4 3c 8a 0e-f4 c5 7d ce 9e 5c 98 de P.]..<....}..\..
0070 - e5 .
Start Time: 1680808973
Timeout : 7200 (sec)
Verify return code: 20 (unable to get local issuer certificate)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
متصفح Chrome
انتقل إلى https://my-app.westeurope.azurecontainer.io
الشهادة وتحقق منها بالنقر فوق القفل بجوار عنوان URL.
للاطلاع على تفاصيل الشهادة، حدد على "الاتصال آمن" متبوعا ب "الشهادة صالحة".