로컬 브라우저로 가상머신에서 rails server로 실행한 애플리케이션에 접속하기

Paikwiki
이동: 둘러보기, 검색

이 글은 md 문서를 pandoc을 통해 미디어위키 문서로 변환한 문서로, 결국 로컬 브라우저에서 rails server로 실행한 애플리케이션에 접속하는 방법은 못 찾았다. pandoc 테스트겸 올린다. -- Ch paik 2016년 6월 8일 (수) 12:01 (KST)


트러블슈팅[ ]

학습하면서 어렵게 해결한 부분들에 대해 정리하기 위한 문서다.

1. Vagrant 설정 관련[ ]

1.1 로컬 브라우저로 가상머신에서 rails server로 실행한 애플리케이션에 접속하기[ ]

처음 Vagrantfilenetwork 설정을 아래와 같이 한 후, 로컬 브라우저에서 설정한 주소([[1]])로 접속해NginX 기본화면을 확인했다.

# Create a private network, whick allows host-only access to the machine
# Using a specific IP.
    config.vm.network "private_network", ip: "192.168.33.10"

기본 화면을 볼 수 있다는 건 로컬과 가상머신이 잘 연결됐다는 의미로, RubyNode.jsport 설정만 적절히 해주면 로컬에서도 가상머신에서 구동한 앱에 접속할 수 있으리라 기대했다. 하지만 생각처럼 잘 되지 않았고, 결국 이 문제로 반나절을 버렸다. 내가 CentOS에 익숙하지 않다는 점도 이 문제의 해결 방법을 찾지 못한 데 한몫하지 않았나 싶기도 하지만, 일단 가상머신과 로컬 사이의 포트를 제어하는 기본 지식이 부족하다는 점이 근본적이 원인으로 보인다. 따라서 이번 기회에 이 부분에 대해 반드시 문제를 해결하고 넘어가보려 했다.

첫 번째 시도 - 옵션 지정하기[ ]

매뉴얼에 나온 옵션을 적용해봤다. 이 참에 IP도 책에 나온 게 아닌 docs의 IP로 수정했다.

config.vm.network "private_network", ip: "192.168.50.4",
    virtualbox__intnet: true

하지만 별다른 변화가 없었다.

두 번째 시도 - 네트워크 설정을 바꾸기[ ]

혹시 "private_network"라는 게, 보안을 위해 다른 포트를 허용하지 않는 건 아닐까 하는 마음에 다른 설정을 찾아봤다.

config.vm.network :forwarded_port, guest: 3000, host: 3000

이 방법은 가상머신의 포트와 로컬의 포트를 지정해 포워딩해주는 방법인데, 이 역시 반응이 없었다. 3000이 아닌 다른 포트도 시도했으나 반응이 없었다. public_network로도 설정하는 방법도 있었다.

config.vm.network "public_network"

설정을 이렇게 바꿔주고 다시 Vagrant를 실행했다.

$ vagrant up --provision
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Available bridged network interfaces:
1) en0: Wi-Fi (AirPort)
2) en1: Thunderbolt 1
3) en2: Thunderbolt 2
4) p2p0
5) awdl0
6) bridge0
==> default: When choosing an interface, it is usually the one that is
==> default: being used to connect to the internet.
    default: Which interface should the network bridge to? 

1을 입력하고 진행한 후 [[2]]로 접속했으나 이번에는 응답 대기도 없이 브라우저에 페이지를 찾을 수 없다는 메시지가 나왔다.

This site can’t be reached

localhost refused to connect.

세 번째 시도 - 방화벽 열기[ ]

아무래도 포트가 막혀있는 건 아닐까 싶어서 ’centos 포트 열기’로 검색해서 포트를 수정했다. 포트 수정 전에 앞서, 책의 설정대로 Vagrantfile을 수정했다.

config.vm.network "private_network", ip: "192.168.33.10"

일단 포트의 상태를 알아야하므로 상태를 볼 수 있는 커맨드를 검색해보니 `iptables’라는 게 있었다.

$ sudo iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0
INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_direct  all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_IN_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_IN_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_OUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
FORWARD_OUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
OUTPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD_IN_ZONES (1 references)
target     prot opt source               destination
FWDI_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
FWDI_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
FWDI_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain FORWARD_IN_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain FORWARD_OUT_ZONES (1 references)
target     prot opt source               destination
FWDO_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
FWDO_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
FWDO_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain FORWARD_OUT_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain FORWARD_direct (1 references)
target     prot opt source               destination

Chain FWDI_public (3 references)
target     prot opt source               destination
FWDI_public_log  all  --  0.0.0.0/0            0.0.0.0/0
FWDI_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
FWDI_public_allow  all  --  0.0.0.0/0            0.0.0.0/0

Chain FWDI_public_allow (1 references)
target     prot opt source               destination

Chain FWDI_public_deny (1 references)
target     prot opt source               destination

Chain FWDI_public_log (1 references)
target     prot opt source               destination

Chain FWDO_public (3 references)
target     prot opt source               destination
FWDO_public_log  all  --  0.0.0.0/0            0.0.0.0/0
FWDO_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
FWDO_public_allow  all  --  0.0.0.0/0            0.0.0.0/0

Chain FWDO_public_allow (1 references)
target     prot opt source               destination

Chain FWDO_public_deny (1 references)
target     prot opt source               destination

Chain FWDO_public_log (1 references)
target     prot opt source               destination

Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]
IN_public  all  --  0.0.0.0/0            0.0.0.0/0           [goto]

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain INPUT_direct (1 references)
target     prot opt source               destination

Chain IN_public (3 references)
target     prot opt source               destination
IN_public_log  all  --  0.0.0.0/0            0.0.0.0/0
IN_public_deny  all  --  0.0.0.0/0            0.0.0.0/0
IN_public_allow  all  --  0.0.0.0/0            0.0.0.0/0

Chain IN_public_allow (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 ctstate NEW

Chain IN_public_deny (1 references)
target     prot opt source               destination

Chain IN_public_log (1 references)
target     prot opt source               destination

Chain OUTPUT_direct (1 references)
target     prot opt source               destination

잘 모르지만 짐작하기로 input, output, forward 모두 열려 있는 게 아닌가 싶었다. 포트의 설정파일은 etc/sysconfig/iptables에 있다고 해서 열어보니 아무 것도 없었다. 여튼 이 설정에는 포트가 보이지 않으므로 열려있는 포트의 목록을 찾아보기로 했다. netstat이라는 명령어로 포트의 현황을 확인했다.

$ netstat -tulpn | grep LISTEN
(No info could be read for "-p": geteuid()=1000 but you should be root.)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 ::1:25                  :::*                    LISTEN

목록에 3000이 없었다. 혹시 Rails를 실행하지 않아서 열려있지 않은 건가 싶어서 일단 레일즈를 실행하고 다시 확인해봤다.

$ netstat -tulpn | grep LISTEN
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      5513/ruby
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 ::1:3000                :::*                    LISTEN      5513/ruby
tcp6       0      0 ::1:25                  :::*                    LISTEN      -

이상없이 포트가 열려 있는 것을 볼 수 있었다. 가장 위의 80포트의 현황과 3000포트가 동일하다는 건 NginX가 로컬 브라우저에서 열렸으니 Rails를 위한 포트도 사용할 수 있다는 걸로 받아들여야 할 것 같은데 아닌가 보다.

네 번째 시도[ ]

Common issues에서 참고하라고 한 Stack Overflow의 글에 나온 것도 설정해봤으나 변화는 없었다.

Enabling DNS proxy in NAT mode

The NAT engine by default offers the same DNS servers to the guest that are configured on the host. In some scenarios, it can be desirable to hide the DNS server IPs from the guest, for example when this information can change on the host due to expiring DHCP leases. In this case, you can tell the NAT engine to act as DNS proxy using the following command:

$ VBoxManage modifyvm "VM name" --natdnsproxy1 on
Using the host's resolver as a DNS proxy in NAT mode

For resolving network names, the DHCP server of the NAT engine offers a list of registered DNS servers of the host. If for some reason you need to hide this DNS server list and use the host's resolver settings, thereby forcing the VirtualBox NAT engine to intercept DNS requests and forward them to host's resolver, use the following command:

$ VBoxManage modifyvm "VM name" --natdnshostresolver1 on
Note that this setting is similar to the DNS proxy mode, however whereas the proxy mode just forwards DNS requests to the appropriate servers, the resolver mode will interpret the DNS requests and use the host's DNS API to query the information and return it to the guest.

다섯 번째 시도[ ]

포트가 열리지 않는 게 아니라 Rails가 작동하지 않는 건 아닐까 의문이 들어 가상머신의 터미널에서 curl로 접속 시도를 해봤다.

$ curl -v "http://localhost:3000/"
* About to connect() to localhost port 3000 (#0)
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:3000
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Frame-Options: SAMEORIGIN
< X-Xss-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< Content-Type: text/html; charset=utf-8
< Etag: W/"b56dd5f9363ed0f7bd4d11c36d9471dd"
< Cache-Control: max-age=0, private, must-revalidate
< X-Request-Id: 89e12f31-d8a3-49e2-b06a-3f186ee047ba
< X-Runtime: 0.221945
< Server: WEBrick/1.3.1 (Ruby/2.2.3/2015-08-18)
< Date: Tue, 07 Jun 2016 23:09:37 GMT
< Content-Length: 14935
< Connection: Keep-Alive
<
<!DOCTYPE html>
<html>
  <head>
    <title>Ruby on Rails: Welcome aboard</title>
    <style media="screen">
      /* css 생략 */
    </style>
    <script>
      // script 생략
    </script>
  </head>
  <body>
    <div id="page">
      <div id="sidebar">
        <!-- html 코드 생략 -->
      </div>

      <div id="content">
        <!-- html 코드 생략 -->
      </div>

      <div id="footer">&nbsp;</div>
    </div>
  </body>
</html>
* Connection #0 to host localhost left intact

커맨드라인에서는 접속이 가능했다. 결국 문제는 포트 설정과 관련된 문제인 것으로 보인다. 위의 방법들을 조합해서 다양한 시도를 해봤으나 소득이 없었다.

기타 해결하지 못한 의문점[ ]

어떻게 http://localhost:8080/은 가상머신이 실행되기만 하면 NginX와 연동이 되는 걸까? 기본으로 열어주는 포트가 80인 건가?

마지막 편집: 2020년 6월 11일 (목) 08:20