[첫화면으로]"Perl/Mojolicious삽질기" 페이지의 변경 내역

마지막으로 [b]


현재 버전 . . . . 2017-10-31 9:54 am 수정한 사람: Raymundo ["리버스 프록시를 쓸 때 URL 프로토콜 반영" 절 추가]
34 번째 수정본 . . . . 2016-1-7 12:00 am 수정한 사람: Raymundo [로그 - ]
 

변경사항 (가장 최근의 "일반적인 수정"부터) (다른 변경사항 없음)

-372,6 +372,68
Mojo::Log를 사용한 로그는 표준에러로 나오는데, 만일 <code>log</code> 디렉토리가 있다면 그 디렉토리 아래에 <code>현재모드.log</code> 파일에 기록된다. 어느 순간 화면에 로그가 나오지 않아 당황했는데 파일로 기록되고 있었음. 이때 log 디렉토리는 "현재 작업 디렉토리" 아래가 아니라, 앱 스크립트가 있는 디렉토리 아래에 있어야 적용되더라.
== # 리버스 프록시를 쓸 때 URL 프로토콜 반영 ==
Nginx를 리버스 프록시로 사용해서 그 위에서 Mojo 앱이 실행되는데, 웹브라우저-Nginx간은 HTTPS를 쓰는데 모조 앱에서 `url_for(..)->to_abs`를 해보면 프로토콜이 http로 나오는 문제가 있었다. 모조 앱 입장에서는 프록시와 자신간의 연결이 그냥 http 라서. 이것은 `redirect_to`등 URL을 자동으로 생성해주는 루틴들에 공히 적용되는 듯.
해결책:
Nginx 쪽에서는 `X-Forwarded-Proto` 헤더를 써서 현재 프로토콜을 앱으로 전달한다.
{{{#!vim
upstream ssltest {
    server 127.0.0.1:9000;
}
server {
    listen 80;
    listen 443 ssl;
    server_name ssltest.server.com;
    location / {
        proxy_pass http://ssltest/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 이것과
        proxy_set_header X-Forwarded-Proto $scheme;  # 이것
    }
}
}}}
이것을 모조 앱 쪽에서 이용해야 하는데,
앱을 실행하는 데 Hypnotoad 를 쓴다면(나는 안 써봤지만)
* http://mojolicious.org/perldoc/Mojo/Server/Hypnotoad#proxy
* http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Hypnotoad
{{{#!vim
proxy => 1
# myapp.conf
{hypnotoad => {proxy => 1}};
}}}
앱을 실행하는 데 Plack을 쓴다면
* http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#PSGI-Plack
{{{#!vim
MOJO_REVERSE_PROXY=1 plackup ./script/my_app
}}}
실행 환경 쪽을 손대지 않고 앱 자체에서 넘어온 헤더값을 반영하는 경우는
* http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Rewriting
* https://stackoverflow.com/questions/47009434/how-to-make-mojoliciouss-url-for-to-abs-return-correct-scheme-http-or-htt
{{{#!vim
hook 'before_dispatch' => sub {
  my $c = shift;
  $c->req->url->base->scheme( $c->req->headers->header('X-Forwarded-Proto'))
    if $c->req->headers->header('X-Forwarded-Proto');
};
}}}
== # Comments ==
<div class="comments">
<longcomments(100)>