www.mtkn.jp

Manuscripts for my personal webpage.
git clone https://git.mtkn.jp/www.mtkn.jp
Log | Files | Refs | LICENSE

setting_up_web_server.html (12356B)


      1 +++
      2 date = '2022-06-27T00:00:00+09:00'
      3 draft = false
      4 title = 'Webサーバーの設定'
      5 +++
      6 <time>2022-06-27</time>
      7 
      8 <h2>はじめに</h2>
      9 <p>OpenBSDでWebサーバーを公開する方法のメモ。といってもmanページが完璧なのであまり書く必要はない。ドメインのあたりの知識は適当なので間違っていたらごめんなさい。コンピュータの知識は全部独学なので多少間違った理解をしていても訂正されることがない。言葉の定義等細かいことがいいかげんになりがちである。</p>
     10 
     11 <h2>環境</h2>
     12 <ul>
     13 	<li>OS: OpenBSD 7.1</li>
     14 	<li>サーバー: httpd(OpenBSDに付属のもの)</li>
     15 	<li>サーバー証明書: Let's Encrypt</li>
     16 	<li>サーバー: さくらのVPS。ここではIPアドレスを<code><i>&lt;server_ip&gt;</i></code>とする。</li>
     17 	<li>ドメイン: さくらのドメイン。ここでは<code><i>&lt;server_domain&gt;</i></code>とする。</li>
     18 </ul>
     19 
     20 <h2>設定の概要</h2>
     21 <dl>
     22 	<dt>サーバーを用意</dt>
     23 		<dd>サーバーはウェブサイトのデータを保存し、ブラウザからアクセスされた時にそのデータを送り返すためのものである。ここではさくらのVPSを用いた。 </dd>
     24 	<dt>ドメインの取得とDNSの設定</dt>
     25 		<dd>インターネット上のサーバー等はIPアドレスを用いて識別されているが、数字の羅列なので人間には覚えにくい。そのためドメイン名という、好きなアルファベットの文字列をIPアドレスと紐付ける。インターネットにはこのドメイン名を用いて紐付いたサーバーと通信できるような仕組みがあり、これをDomain Name System(DNS)という。ドメインはインターネット上で利用料を支払うことで購入できる。IPアドレスとドメイン名の紐付け等DNSの設定は基本的にはドメインを購入したサイトでできるはずである。</dd>
     26 	<dt>httpdの設定</dt>
     27 		<dd>VPS上でサーバー用のソフトウェアを設定、起動する。</dd>
     28 	<dt>証明書の発行と自動更新の設定</dt>
     29 		<dd>ウェブブラウザとサーバーの間で暗号化された通信を行うために必要なものである。</dd>
     30 	<dt>ホームページのファイルをアップロード</dt>
     31 		<dd>ウェブページで配信したいものをVPSにアップロードする。</dd>
     32 	<dt>接続の確認</dt>
     33 		<dd>手元のブラウザからアクセスできることを確認。</dd>
     34 </dl>
     35 
     36 <h2>サーバーを用意</h2>
     37 <p>サーバーをどこかで契約する。ここではさくらのVPSを利用。</p>
     38 
     39 <h2>ドメインの取得とDNSの設定</h2>
     40 <p>ドメインを好きな場所で取得してDNSを設定する。さくらのドメインではドメインコントロールパネルのゾーン情報から設定できる。ここではサブドメインなしのものと、サブドメインがwwwのものを設定した。VPSのIPアドレスはVPSのコントロールパネルから確認できる。</p>
     41 <pre><code>HOST                    TYPE       POINTS TO            TTL
     42 <i>&lt;server_domain&gt;</i>         A          <i>&lt;server_ip&gt;</i>          3600
     43 www.<i>&lt;server_domain&gt;</i>     A          <i>&lt;server_ip&gt;</i>          3600</code></pre>
     44 <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>
     45 <p>この設定が反映されれば、ドメイン名からサーバーにアクセスできるようになる。</p>
     46 <pre><code>$ ping <i>&lt;server_domain&gt;</i>
     47 PING <i>&lt;server_domain&gt;</i> (<i>&lt;server_ip&gt;</i>): 56 data bytes
     48 64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=0 ttl=243 time=38.032 ms
     49 64 bytes from <i>&lt;server_ip&gt;</i>: icmp_seq=1 ttl=243 time=27.923 ms
     50 ^C</code></pre>
     51 
     52 <h2>httpdの設定</h2>
     53 <p>VPSにログインし、httpdを設定する。まずは<code>/etc/examples/</code>にある設定ファイルのサンプルを<code>/etc/</code>にコピーして必要な部分を変更する。</p>
     54 <pre><code>$ doas cp /etc/examples/httpd.conf /etc/
     55 vi /etc/httpd.conf</code></pre>
     56 
     57 <pre><code># $OpenBSD: httpd.conf,v 1.22 2020/11/04 10:34:18 denis Exp $
     58 
     59 server "<i>&lt;server_domain&gt;</i>" {
     60 	listen on * port 80
     61 	location "/.well-known/acme-challenge/*" {
     62 		root "/acme"
     63 		request strip 2
     64 	}
     65 	location * {
     66 		block return 302 "https://$HTTP_HOST$REQUEST_URI"
     67 	}
     68 }
     69 
     70 server "<i>&lt;server_domain&gt;</i>" {
     71 	listen on * tls port 443
     72 	tls {
     73 		certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem"
     74 		key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key"
     75 	}
     76 	location "/.well-known/acme-challenge/*" {
     77 		root "/acme"
     78 		request strip 2
     79 	}
     80 	location "*" {
     81 		root "/htdocs/www.<i>&lt;server_domain&gt;</i>"
     82 		directory auto index
     83 	}
     84 }</code></pre>
     85 <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>&lt;server_domain&gt;</i></code>にしたのでウェブページのデータは<code>/var/www/htdock/www.<i>&lt;server_domain&gt;</i>/</code>というディレクトリ以下に配置することになる。</p>
     86 <p>ここで一度<code>httpd</code>を<code>-n</code>オプションを付けて実行し、設定ファイルのミスがないか確認しておく。</p>
     87 <pre><code>$ doas httpd -n
     88 configration OK</code></pre>
     89 
     90 <h2>証明書の発行と自動更新の設定</h2>
     91 <p>httpsによる暗号化に対応するため、Let's Encryptを使って証明書を発行する。OpenBSDには<code>acme-client</code>という便利なスクリプトが付いてきてほぼ全部自動でやってくれる。まずはこの<code>acme-client</code>の設定を変更して自分のドメインの証明書を取得するようにする。</p>
     92 <pre><code>$ doas cp /etc/examples/acme-client.conf /etc/
     93 $ doas vi /etc/acme-client.conf</code></pre>
     94 <pre><code>#
     95 # $OpenBSD: acme-client.conf,v 1.4 2020/09/17 09:13:06 florian Exp $
     96 #
     97 authority letsencrypt {
     98 	api url "https://acme-v02.api.letsencrypt.org/directory"
     99 	account key "/etc/acme/letsencrypt-privkey.pem"
    100 }
    101 
    102 authority letsencrypt-staging {
    103 	api url "https://acme-staging-v02.api.letsencrypt.org/directory"
    104 	account key "/etc/acme/letsencrypt-staging-privkey.pem"
    105 }
    106 
    107 authority buypass {
    108 	api url "https://api.buypass.com/acme/directory"
    109 	account key "/etc/acme/buypass-privkey.pem"
    110 	contact "mailto:<i>&lt;your_mail_address&gt;</i>"
    111 }
    112 
    113 authority buypass-test {
    114 	api url "https://api.test4.buypass.no/acme/directory"
    115 	account key "/etc/acme/buypass-test-privkey.pem"
    116 	contact "mailto:<i>&lt;your_mail_address&gt;</i>"
    117 }
    118 
    119 domain <i>&lt;server_domain&gt;</i> {
    120 	alternative names { secure.<i>&lt;server_domain&gt;</i> }
    121 	domain key "/etc/ssl/private/<i>&lt;server_domain&gt;</i>.key"
    122 	domain full chain certificate "/etc/ssl/<i>&lt;server_domain&gt;</i>.fullchain.pem"
    123 	sign with letsencrypt
    124 }</code></pre>
    125 <p>変更箇所は<code>contact</code>の部分のメールアドレスと、<code>domain</code>の部分のドメイン名。</p>
    126 <p>続いて<code>acme-client</code>を実行して証明書を発行する。</p>
    127 <pre><code>$ doas acme-client -v <i>&lt;server_domain&gt;</i></code></pre>
    128 <p>次に<code>cron</code>を用いて証明書の自動更新を行うようにする。</p>
    129 <pre><code>$ doas crontab -e</code></pre>
    130 <pre><code>...
    131 #minute hour    mday    month   wday    [flags] command
    132 19 2 * * * acme-client -v <i>&lt;server_domain&gt;</i> && rcctl reload httpd
    133 ...
    134 </code></pre>
    135 <p>ここで設定した時間は適当。サーバーが暇そうな時間にする。僕のサーバーはいつも暇。</p>
    136 
    137 <h2>ホームページのファイルのアップロード</h2>
    138 <p>ウェブページに表示させたい内容のファイルをサーバーにアップロードする。試すだけであれば適当なファイルでいい。場所は今回の設定では<code>/var/www/htdocs/www.<i>&lt;server_domain&gt;</i>/</code>以下。ただし<code>httpd.conf</code>で<code>chroot</code>や、<code>server</code>ディレクティブの<code>location</code>ディレクティブの<code>root</code>の値を変更していれば、<code><i>&lt;chroot&gt;</i>/<i>&lt;root&gt;</i>/</code>にアップロードする。ここではテストのために適当なものを置いておく。</p>
    139 <pre><code>$ doas mkdir /var/www/htdocs/www.<i>&lt;server_domain&gt;</i>
    140 $ echo '&lt;h1&gt;unko&lt;/h1&gt;' | doas tee /var/www/htdocs/pub/index.html</code></pre>
    141 
    142 <h2>接続の確認</h2>
    143 <p>最後に<code>httpd</code>を起動して接続を確認する。まずは<code>rc.conf.local</code>に<code>httpd</code>の起動を許可するように記入。</p>
    144 <pre><code>$ echo 'httpd_flags=' | doas tee -a /etc/rc.conf/local</code></pre>
    145 <p>続いてrcに登録、起動。</p>
    146 <pre><code>$ doas rcctl start httpd
    147 $ doas rcctl enable httpd</code></pre>
    148 <p>ブラウザでアクセスしてみる。</p>
    149 
    150 <h2>おわりに</h2>
    151 <p>とりあえず残したかったので書いてみたが、冒頭でも言った通り知識が曖昧であることに気づかされた。文章もいまいち分かりにくい箇所が多いがとりあえずこのまま置いておく。日記の記事ではないので気が向いたときに少しずつ改訂できればいいかな。</p>
    152 
    153 <h2>参考文献</h2>
    154 <ul>
    155 	<li><a href="https://man.openbsd.org/httpd">httpd(8)</a>.Openbsd manual pages.2022-06-27閲覧</li>
    156 	<li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li>
    157 	<li><a href="https://man.openbsd.org/acme-client">acme-crient(1)</a>.Openbsd manual pages.2022-06-27閲覧</li>
    158 	<li><a href="https://man.openbsd.org/acme-client.conf">acme-crient.conf(5)</a>.Openbsd manual pages.2022-06-27閲覧</li>
    159 	<li><a href="https://man.openbsd.org/crontab">crontab(1)</a>.Openbsd manual pages.2022-06-27閲覧</li>
    160 	<li><a href="https://letsencrypt.org/">Let's Encrypt</a>.Let's Encrypt.2022-06-27閲覧</li>
    161 	<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>
    162 </ul>
    163