WEBRick에서 웹 서버를 시작하고 동일한 LAN의 PC에서 액세스

8713 단어 루비WEBRick

동기



프레임워크 없이도 WEBRick에서 쉽게 웹 서버를 만들 수 있다는 것을 읽고, 재미있을 것 같았기 때문에 수중에서 시험해 보겠습니다. 이하, 잊지 않도록 하기 위한 기록입니다.

WEBRick에서 웹 서버를 시작합니다 (먼저 로컬 전용)



WEBRick에 대해 자세한 것은 이쪽을 보면서.

↑ 이것을 보면,

WEBrick은 Ruby 3.0에서 표준 라이브러리에서 제거되었습니다. Ruby 3.0 이상에서 WEBrick을 사용하려면 rubygems에서 사용하십시오.

라는 것이므로, gem install 해 둡니다.
$ gem install webrick

그런 다음 적절한 디렉토리를 만들어 파일을 만듭니다.

server.rb
require 'webrick'
options = { BindAddress: '127.0.0.1', Port: '10080', DocumentRoot: '.' }
server = WEBRick::HTTPServer.new(options)
trap(:INT) { server.shutdown } # Signal.trap(:INT) { server.shutdown } でも同じ
server.start

웹 서버 객체(즉, WEBRick::HTTPServer 의 인스턴스)는 start 메소드 을 가지며, 이것이 결국 웹 서버를 시작하게 합니다.
웹 서버 객체는 WEBRick::HTTPServer.new(options)에서 작성되었습니다.
options로서는 우선 BindAddress , Port , DocumentRoot 의 3항목을 건네주면 움직인다고 합니다. 다른 항목에 대해서는 루리마 에 정리되어 있었습니다.BindAddress127.0.0.1 를 전달하면 로컬 전용 웹 서버가 되고, 0.0.0.0 를 전달하면 LAN 내에 공개된 웹 서버가 됩니다.trap(:INT) 의 행으로 ctrl+c 가 입력되었을 때의 동작을 지정하고 있습니다. 여기서는 server.shutdown 에서 서버를 중지합니다. (이 줄을 쓰지 않으면 ctrl+c 에서 멈출 수 없습니다.

그리고 이 파일을 실행하면 웹 서버가 시작됩니다.
$ ruby server.rb
#[2021-10-31 18:09:13] INFO  WEBrick 1.7.0
#[2021-10-31 18:09:13] INFO  ruby 3.0.2 (2021-07-07) [x86_64-darwin20]
#[2021-10-31 18:09:13] INFO  WEBrick::HTTPServer#start: pid=23294 port=10080

curl로 액세스해 보겠습니다.
$ curl http://127.0.0.1:10080
# (以下結果)                                                   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
  <HEAD>
    <TITLE>Index of /</TITLE>
    <style type="text/css">
    <!--
    .name, .mtime { text-align: left; }
    .size { text-align: right; }
    td { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }
    table { border-collapse: collapse; }
    tr th { border-bottom: 2px groove; }
    //-->
    </style>
  </HEAD>
  <BODY>
    <H1>Index of /</H1>
<TABLE width="100%"><THEAD><TR>
<TH class="name"><A HREF="?N=D">Name</A></TH><TH class="mtime"><A HREF="?M=D">Last modified</A></TH><TH class="size"><A HREF="?S=D">Size</A></TH>
</TR></THEAD>
<TBODY>
<TR><TD class="name"><A HREF="..">Parent Directory</A></TD><TD class="mtime">2021/10/31 18:19</TD><TD class="size">-</TD></TR>
<TR><TD class="name"><A HREF="webrick227.rb">webrick227.rb</A></TD><TD class="mtime">2021/10/31 18:19</TD><TD class="size">375</TD></TR>
</TBODY></TABLE><HR>    <ADDRESS>
     WEBrick/1.7.0 (Ruby/3.0.2/2021-07-07)<BR>
     at 127.0.0.1:10080
    </ADDRESS>
  </BODY>
</HTML>

색인 페이지의 HTML이 반환되었습니다!
curl에서 지정한 것과 동일한 url을 브라우저에서 열면 ... 어라?


10080번 포트는 브라우저에서 볼 수 없다


ps aux | grep webrick 라고 써 있습니다. 조사하면 분명히 브라우저가 최근 10080번 포트 사이트를 볼 수 없도록 하는 것 같습니다.

솔직하게 10080번을 피해, ERR_UNSAFE_PORToptions 로 지정하는 것을 Port
server.rb
# 省略
options = { BindAddress: '127.0.0.1', Port: '20080', DocumentRoot: '.' }
# 省略

url은 htp://127.0.0.1:20080입니다.
그러자 이런 화면이 되었습니다.

20080options 로 지정한 디렉토리에 DocumentRoot 라는 파일이 없으면 이 화면이 됩니다. ( 홈페이지에 접속하면 「index of/」라고 표시되어 파일이 리스트로 표시되어 버린다 )
이번은 index.html 에는 현재 디렉토리( DocumentRoot )를 지정하고 있으므로, '.' 와 같은 계층에 server.rb 를 작성해 내용을 적당히 준비해 보겠습니다.

index.html
<h1>Hello World!</h1>

브라우저에서 조금 같은 URL (htp://127.0.0.1:20080)에 액세스하면 ...

방금전의 index.html 라는 화면이 아니라, Index of / 의 내용이 표시되게 되었습니다!

웹 서버를 LAN에 게시



위에서 쓴 것처럼, index.htmloptionsBindAddress 를 건네주면 로컬 전용의 Web 서버가 되어, 127.0.0.1 를 건네주면 LAN내에 공개된 Web 서버가 됩니다.
(카페 등의 공공 LAN에 연결할 때는 위험하기 때문에 시도하지 않는 것이 좋다고 생각합니다)

server.rb
# 省略
options = { BindAddress: '0.0.0.0', Port: '20080', DocumentRoot: '.' }
server = WEBRick::HTTPServer.new(options)
# 省略

서버를 다시 시작합니다.
$ ruby server.rb

이제 동일한 LAN 내의 다른 PC나 스마트폰에서도 액세스할 수 있게 되어 있을 것입니다.
액세스하려면 0.0.0.0 대신 개인 IP 주소를 사용하십시오. 물론 포트 번호 (여기서는 127.0.0.1)도 계속해야합니다.
url은 예를 들어 20080 와 같아야합니다.

이제 같은 Wi-Fi에 연결된 다른 단말기의 브라우저에 이 url을 넣으면 http://192.168.1.21:20080 의 내용을 볼 수 있었습니다.
놀이로 여러가지 쓸만한 느낌입니다.

반복됩니다만, 공공의 LAN에 연결하고 있을 때는 시도하지 않는 편이 좋다고 생각합니다.

좋은 웹페이지 즐겨찾기