왜 /var/discourse/containers/web_only.yml에서 다음과 같이 포트를 노출하는 것이 작동하지 않는지 그 문제를 찾았습니다.
expose:
# - "443:443"
# - "80:80"
- "8080:80" # https
https://www.programmerall.com/article/443137626/ 에 따르면 SELinux가 원인이었으며, NGINX가 Discourse에 접근할 수 있도록 허용하려면 setsebool -P httpd_can_network_connect 1을 실행하거나 SELinux를 Permissive(허용) 모드로 설정해야 합니다.
흥미로운 점은 NGINX 설정이 루트 경로로 설정되어 있으면 정상적으로 작동하지만, 루트 경로가 아닌 경로로 설정되어 있으면 작동하지 않는다는 것입니다.
NGINX가 /를 Discourse로 전달하도록 설정 (작동함)
# 443/discussions 요청을 127.0.0.1:8080에서 리스닝 중인 Discourse로 프록시
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
NGINX가 /discussions/를 Discourse로 전달하도록 설정 (작동하지 않음)
# 443/discussions 요청을 127.0.0.1:8080에서 리스닝 중인 Discourse로 프록시
location /discussions/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
이 경우 다음과 같은 로그가 나타납니다 … 제 직감으로는 NGINX가 루트 경로가 아닌 /discussions/ 경로를 Discourse 도커로 성공적으로 전달했음에도 불구하고, Discourse 자체는 여전히 자사에서 페이지를 로드하고 있으며 에셋이 루트 경로 /에 있다고 기대하는 것 같습니다. 추측컨대 Discourse는 루트 경로에서만 실행해야 하는 요구 사항이 있는 것 같습니다. @pfaffman 이 현상을 전에 본 적 있으신가요?
/var/log/nginx/example.com.error.log
2022/10/01 09:33:23 [error] 1954781#1954781: *1 open() "/etc/nginx/html/images/discourse-logo-sketch.png" failed (2: No such file or directory), client: 219.78.157.149, server: uat.example.com, request: "GET /images/discourse-logo-sketch.png HTTP/1.1", host: "uat.example.com", referrer: "https://uat.example.com/discussions/"
2022/10/01 09:33:25 [error] 1954781#1954781: *1 open() "/etc/nginx/html/service-worker.js" failed (2: No such file or directory), client: 219.78.157.149, server: uat.example.com, request: "GET /service-worker.js HTTP/1.1", host: "uat.example.com", referrer: "https://uat.example.com/service-worker.js"