setting_up_web_server.html (13235B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <link rel="stylesheet" type="text/css" href="/style.css"> 7 <link rel="icon" type="image/x-icon" href="/pics/favicon.ico"> 8 <title>Webサーバーの設定</title> 9 </head> 10 <body> 11 <header> 12 <a href="/">主頁</a> | 13 <a href="/about.html">自己紹介</a> | 14 <a href="/journal">日記</a> | 15 <a href="/farm">農業</a> | 16 <a href="/kitchen">台所</a> | 17 <a href="/computer">電算機</a> | 18 <a href="/poetry">詩</a> | 19 <a href="/books">本棚</a> | 20 <a href="/gallery">絵</a> | 21 <a href="/plant">植物</a> | 22 <a href="https://git.mtkn.jp">Git</a> 23 </header> 24 <main> 25 <article> 26 <h1>Webサーバーの設定</h1> 27 <time>2022-06-27</time> 28 29 <h2>はじめに</h2> 30 <p>OpenBSDでWebサーバーを公開する方法のメモ。といってもmanページが完璧なのであまり書く必要はない。ドメインのあたりの知識は適当なので間違っていたらごめんなさい。コンピュータの知識は全部独学なので多少間違った理解をしていても訂正されることがない。言葉の定義等細かいことがいいかげんになりがちである。</p> 31 32 <h2>環境</h2> 33 <ul> 34 <li>OS: OpenBSD 7.1</li> 35 <li>サーバー: httpd(OpenBSDに付属のもの)</li> 36 <li>サーバー証明書: Let's Encrypt</li> 37 <li>サーバー: さくらのVPS。ここではIPアドレスを<code><i><server_ip></i></code>とする。</li> 38 <li>ドメイン: さくらのドメイン。ここでは<code><i><server_domain></i></code>とする。</li> 39 </ul> 40 41 <h2>設定の概要</h2> 42 <dl> 43 <dt>サーバーを用意</dt> 44 <dd>サーバーはウェブサイトのデータを保存し、ブラウザからアクセスされた時にそのデータを送り返すためのものである。ここではさくらのVPSを用いた。 </dd> 45 <dt>ドメインの取得とDNSの設定</dt> 46 <dd>インターネット上のサーバー等はIPアドレスを用いて識別されているが、数字の羅列なので人間には覚えにくい。そのためドメイン名という、好きなアルファベットの文字列をIPアドレスと紐付ける。インターネットにはこのドメイン名を用いて紐付いたサーバーと通信できるような仕組みがあり、これをDomain Name System(DNS)という。ドメインはインターネット上で利用料を支払うことで購入できる。IPアドレスとドメイン名の紐付け等DNSの設定は基本的にはドメインを購入したサイトでできるはずである。</dd> 47 <dt>httpdの設定</dt> 48 <dd>VPS上でサーバー用のソフトウェアを設定、起動する。</dd> 49 <dt>証明書の発行と自動更新の設定</dt> 50 <dd>ウェブブラウザとサーバーの間で暗号化された通信を行うために必要なものである。</dd> 51 <dt>ホームページのファイルをアップロード</dt> 52 <dd>ウェブページで配信したいものをVPSにアップロードする。</dd> 53 <dt>接続の確認</dt> 54 <dd>手元のブラウザからアクセスできることを確認。</dd> 55 </dl> 56 57 <h2>サーバーを用意</h2> 58 <p>サーバーをどこかで契約する。ここではさくらのVPSを利用。</p> 59 60 <h2>ドメインの取得とDNSの設定</h2> 61 <p>ドメインを好きな場所で取得してDNSを設定する。さくらのドメインではドメインコントロールパネルのゾーン情報から設定できる。ここではサブドメインなしのものと、サブドメインがwwwのものを設定した。VPSのIPアドレスはVPSのコントロールパネルから確認できる。</p> 62 <pre><code>HOST TYPE POINTS TO TTL 63 <i><server_domain></i> A <i><server_ip></i> 3600 64 www.<i><server_domain></i> A <i><server_ip></i> 3600</code></pre> 65 <p><code>HOST</code>はサーバーのFQDN。コントロールパネル上ではサブドメインの部分だけを設定すればよい。サブドメインが無い場合は<code>@</code>と記入する。<code>TYPE</code>は設定するレコードの属性でIPv4のサブドメインを設定する場合は<code>A</code>。この他、IPv6用の<code>AAAA</code>やメールサーバー用の<code>MX</code>、サーバーの別名を登録する<code>CNAME</code>等がある。<code>POINTS TO</code>はサーバーのIPアドレス。<code>TTL</code>はDNSのキャッシュの生存時間の秒数で、DNSの登録内容を変更した際にその変更が世界中のDNSサーバーに反映されるまでにかかる最大の時間である。世界中から多くのアクセスがあるサーバーの場合、DNSの登録内容を変更する前にTTLを短かくしておかないと、キャッシュが破棄されるまでアクセス不能になる。個人のウェブページではまあそんなにアクセスもないし適当でよさそう。ここでは1時間を指定した。</p> 66 <p>この設定が反映されれば、ドメイン名からサーバーにアクセスできるようになる。</p> 67 <pre><code>$ ping <i><server_domain></i> 68 PING <i><server_domain></i> (<i><server_ip></i>): 56 data bytes 69 64 bytes from <i><server_ip></i>: icmp_seq=0 ttl=243 time=38.032 ms 70 64 bytes from <i><server_ip></i>: icmp_seq=1 ttl=243 time=27.923 ms 71 ^C</code></pre> 72 73 <h2>httpdの設定</h2> 74 <p>VPSにログインし、httpdを設定する。まずは<code>/etc/examples/</code>にある設定ファイルのサンプルを<code>/etc/</code>にコピーして必要な部分を変更する。</p> 75 <pre><code>$ doas cp /etc/examples/httpd.conf /etc/ 76 vi /etc/httpd.conf</code></pre> 77 78 <pre><code># $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $ 79 80 server "<i><server_domain></i>" { 81 listen on * port 80 82 location "/.well-known/acme-challenge/*" { 83 root "/acme" 84 request strip 2 85 } 86 location * { 87 block return 302 "https://$HTTP_HOST$REQUEST_URI" 88 } 89 } 90 91 server "<i><server_domain></i>" { 92 listen on * tls port 443 93 tls { 94 certificate "/etc/ssl/<i><server_domain></i>.fullchain.pem" 95 key "/etc/ssl/private/<i><server_domain></i>.key" 96 } 97 location "/.well-known/acme-challenge/*" { 98 root "/acme" 99 request strip 2 100 } 101 location "*" { 102 root "/htdocs/www.<i><server_domain></i>" 103 directory auto index 104 } 105 }</code></pre> 106 <p>一つ目の<code>server</code>ディレクティブは80番ポートにアクセスがあった時の設定。80番ポートは暗号化なしのアクセスなので、二つ目の<code>location</code>ディレクティブで暗号化ありの<code>https</code>の方にリダイレクトさせるようにしている。一つ目の<code>location</code>ディレクティブは<code>acme-client</code>がサーバー証明書を発行する際にアクセスされる場所である。既定値のままにしておけばよい。二つ目の<code>server</code>ディレクティブは443番ポートにアクセスがあった時の設定。<code>tls</code>ディレクティブにおいてサーバー証明書と、暗号化に利用する鍵が設定されている。これも既定値のままでいい。<code>location</code>ディレクティブはウェブサーバーにアクセスがあった時の処理である。一つ目は80番ポートと同じく<code>acme-client</code>用。二つ目はそれ以外である。<code>root</code>(ドキュメントルート)はアクセスがあったときにどこのディレクトリからファイルを探すかを決めるもので、<code>/var/www</code>からの相対パスで記述する。ここでは<code>/htdocs/www.<i><server_domain></i></code>にしたのでウェブページのデータは<code>/var/www/htdock/www.<i><server_domain></i>/</code>というディレクトリ以下に配置することになる。</p> 107 <p>ここで一度<code>httpd</code>を<code>-n</code>オプションを付けて実行し、設定ファイルのミスがないか確認しておく。</p> 108 <pre><code>$ doas httpd -n 109 configration OK</code></pre> 110 111 <h2>証明書の発行と自動更新の設定</h2> 112 <p>httpsによる暗号化に対応するため、Let's Encryptを使って証明書を発行する。OpenBSDには<code>acme-client</code>という便利なスクリプトが付いてきてほぼ全部自動でやってくれる。まずはこの<code>acme-client</code>の設定を変更して自分のドメインの証明書を取得するようにする。</p> 113 <pre><code>$ doas cp /etc/examples/acme-client.conf /etc/ 114 $ doas vi /etc/acme-client.conf</code></pre> 115 <pre><code># 116 # $OpenBSD: acme-client.conf,v 1.4 2020/09/17 09:13:06 florian Exp $ 117 # 118 authority letsencrypt { 119 api url "https://acme-v02.api.letsencrypt.org/directory" 120 account key "/etc/acme/letsencrypt-privkey.pem" 121 } 122 123 authority letsencrypt-staging { 124 api url "https://acme-staging-v02.api.letsencrypt.org/directory" 125 account key "/etc/acme/letsencrypt-staging-privkey.pem" 126 } 127 128 authority buypass { 129 api url "https://api.buypass.com/acme/directory" 130 account key "/etc/acme/buypass-privkey.pem" 131 contact "mailto:<i><your_mail_address></i>" 132 } 133 134 authority buypass-test { 135 api url "https://api.test4.buypass.no/acme/directory" 136 account key "/etc/acme/buypass-test-privkey.pem" 137 contact "mailto:<i><your_mail_address></i>" 138 } 139 140 domain <i><server_domain></i> { 141 alternative names { secure.<i><server_domain></i> } 142 domain key "/etc/ssl/private/<i><server_domain></i>.key" 143 domain full chain certificate "/etc/ssl/<i><server_domain></i>.fullchain.pem" 144 sign with letsencrypt 145 }</code></pre> 146 <p>変更箇所は<code>contact</code>の部分のメールアドレスと、<code>domain</code>の部分のドメイン名。</p> 147 <p>続いて<code>acme-client</code>を実行して証明書を発行する。</p> 148 <pre><code>$ doas acme-client -v <i><server_domain></i></code></pre> 149 <p>次に<code>cron</code>を用いて証明書の自動更新を行うようにする。</p> 150 <pre><code>$ doas crontab -e</code></pre> 151 <pre><code>... 152 #minute hour mday month wday [flags] command 153 19 2 * * * acme-client -v <i><server_domain></i> && rcctl reload httpd 154 ... 155 </code></pre> 156 <p>ここで設定した時間は適当。サーバーが暇そうな時間にする。僕のサーバーはいつも暇。</p> 157 158 <h2>ホームページのファイルのアップロード</h2> 159 <p>ウェブページに表示させたい内容のファイルをサーバーにアップロードする。試すだけであれば適当なファイルでいい。場所は今回の設定では<code>/var/www/htdocs/www.<i><server_domain></i>/</code>以下。ただし<code>httpd.conf</code>で<code>chroot</code>や、<code>server</code>ディレクティブの<code>location</code>ディレクティブの<code>root</code>の値を変更していれば、<code><i><chroot></i>/<i><root></i>/</code>にアップロードする。ここではテストのために適当なものを置いておく。</p> 160 <pre><code>$ doas mkdir /var/www/htdocs/www.<i><server_domain></i> 161 $ echo '<h1>unko</h1>' | doas tee /var/www/htdocs/pub/index.html</code></pre> 162 163 <h2>接続の確認</h2> 164 <p>最後に<code>httpd</code>を起動して接続を確認する。まずは<code>rc.conf.local</code>に<code>httpd</code>の起動を許可するように記入。</p> 165 <pre><code>$ echo 'httpd_flags=' | doas tee -a /etc/rc.conf/local</code></pre> 166 <p>続いてrcに登録、起動。</p> 167 <pre><code>$ doas rcctl start httpd 168 $ doas rcctl enable httpd</code></pre> 169 <p>ブラウザでアクセスしてみる。</p> 170 171 <h2>おわりに</h2> 172 <p>とりあえず残したかったので書いてみたが、冒頭でも言った通り知識が曖昧であることに気づかされた。文章もいまいち分かりにくい箇所が多いがとりあえずこのまま置いておく。日記の記事ではないので気が向いたときに少しずつ改訂できればいいかな。</p> 173 174 <h2>参考文献</h2> 175 <ul> 176 <li><a href="https://man.openbsd.org/httpd">httpd(8)</a>.Openbsd manual pages.2022-06-27閲覧</li> 177 <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> 178 <li><a href="https://man.openbsd.org/acme-client">acme-crient(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> 179 <li><a href="https://man.openbsd.org/acme-client.conf">acme-crient.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li> 180 <li><a href="https://man.openbsd.org/crontab">crontab(1)</a>.Openbsd manual pages.2022-06-27閲覧</li> 181 <li><a href="https://letsencrypt.org/">Let's Encrypt</a>.Let's Encrypt.2022-06-27閲覧</li> 182 <li><a href="https://ja.wikipedia.org/wiki/Time_to_live#DNS%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AETime_to_live">Time to live</a>.Wikipedia.2022-06-27閲覧</li> 183 </ul> 184 </article> 185 186 </main> 187 <footer> 188 <address>info(at)mtkn(dot)jp</address> 189 <a href="http://creativecommons.org/publicdomain/zero/1.0?ref=chooser-v1" rel="license noopener noreferrer">CC0 1.0</a> 190 </footer> 191 </body> 192 </html>