พร็อกซี (nginx) แสดงข้อผิดพลาดของเกตเวย์ไม่ดี


18

ฉันมีบริการ (รีจิสทรีนักเทียบท่า) ที่วิ่งบนport 5000ผมได้ติดตั้ง Nginx เพื่อเปลี่ยนเส้นทาง http การร้องขอจากไป8080 5000ถ้าฉันทำ curl ให้localhost:5000ใช้งานได้ แต่เมื่อฉันทำ curl กับlocalhost:8080ฉันฉันจะได้รับข้อผิดพลาดของเกตเวย์ที่ไม่ดี

ไฟล์กำหนดค่า nginx:

upstream docker-registry {
 server localhost:5000;
}

server {
 listen 8080;
 server_name registry.mydomain.com;

 proxy_set_header Host       $http_host; 
 proxy_set_header X-Real-IP  $remote_addr; 
 client_max_body_size 0; 
 chunked_transfer_encoding on;

 location / {

     proxy_pass http://docker-registry;
 }
 location /_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }
 location /v1/_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }

}

ใน/var/log/nginx/error.logฉันมี:

[crit] 15595#0: *1 connect() to [::1]:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain.com, request: "GET / HTTP/1.1", upstream: "http://[::1]:5000/", host: "localhost:8080"

ความคิดใด ๆ


ในกรณีของฉันบริการของฉันที่ฉันกำลังพร็อกซี่เสียชีวิต (และฉันก็ไม่ทราบ) ในระหว่างที่ฉันใช้มัน หนึ่งวินาทีที่ฉันเข้าใช้มันวินาทีต่อมาฉันมีเกตเวย์ไม่ดี ฉันต้องเริ่มบริการใหม่
Michael Plautz

คำตอบ:


57

ฉันถือว่ากล่อง Linux เป็นไปได้มากที่สุดที่ SELinux ป้องกันการเชื่อมต่อเนื่องจากไม่มีนโยบายที่อนุญาตการเชื่อมต่อ

คุณควรจะสามารถทำงานได้

# setsebool -P httpd_can_network_connect true

จากนั้นรีสตาร์ท nginx


Selinux ถูกปิดใช้งานรวมถึงไฟร์วอลล์เซอร์วิส
hellb0y77

2
คุณเพิ่งแก้ไขปัญหาของฉันแม้ว่าคุณจะไม่ได้แก้ไขของ hellb0y77 SE_LINUX นัดหยุดงานอีกครั้ง!
Wesley Burr

1
ที่ทำงานให้ฉันด้วย ไม่มีใครมีข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่มันกำลังทำจริง ๆ ? ฉันเกลียดที่ไม่รู้
Martinedwards

โหวตขึ้นและทำงานกับ CentOs 7 ฉันสามารถถามปัญหาความปลอดภัยที่อาจเปิด โดยทั่วไปฉันเรียกใช้ชุดของกฎ iptables ที่อนุญาตการรับส่งข้อมูลภายใน สงสัยว่าสิ่งนี้มีผลกระทบ
edencorbin

1
@edencorbin อนุญาตให้โมดูล httpd สามารถเชื่อมต่อกับเครือข่ายได้
Warren

5

จากข้อผิดพลาดทำให้ฉันสงสัยว่า localhost: 5000 กำลังแก้ไขเป็นที่อยู่ ipv6 ซึ่งคุณอาจไม่ต้องการ คุณสามารถลองเปลี่ยนเป็น 127.0.0.1,5000

แก้ไข:ในบรรทัด proxy_pass ของคุณเป็นไปได้หรือไม่ว่าคุณหายไปบางส่วนของ URL ลองเพิ่ม $ request_uri เพื่อเป็น:

proxy_pass http://docker-registry/$request_uri;

หรืออาจจะ:

proxy_pass http://docker-registry$request_uri;

ไม่แน่ใจว่าอันไหนถูกต้องที่สุด

สิ่งที่ต้องพิจารณาอีกประการหนึ่ง การกำหนดค่าของคุณระบุ:

server_name registry.mydomain.com;

ดังนั้น localhost: 8080 อาจไม่ตรงกัน สำหรับการทดสอบคุณสามารถเปลี่ยนเป็น:

server_name registry.mydomain.com localhost;

จากนั้น localhost: 8080 จะจับคู่เช่นเดียวกับโดเมนของคุณ ฉันสมมติว่า registry.mydomain.com เป็นเพียงตัวอย่างและคุณจะใส่ FQDN เซิร์ฟเวอร์จริงไว้ในนั้น


ไม่ทำงานตั้งค่า127.0.0.1:5000และฉันได้ลองด้วยเท่านั้นserver_name localhostและserver_name registry.mydomain.com(ลองจากเซิร์ฟเวอร์อื่นใน LAN เดียวกันกับชื่อโฮสต์registry.mydomain.comใน / etc / hosts) และทั้งสองอย่าง แต่ไม่มีอะไร ... ข้อผิดพลาดเดียวกัน
hellb0y77

Whit registry.mydomain.com [crit] 16839#0: *5 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain,com request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "localhost:8080"กับ localhost:[crit] 16839#0: *5 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "localhost:8080"
hellb0y77
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.