いますぐ実践! Linuxシステム管理

Last-Modified: 2022/6/5

いますぐ実践! Linux システム管理 / Vol.306 / 読者数:2,507名

こんばんは、うすだです。

公共交通機関の支払いもQUICPayにしたところ、大抵の支払いがiPhoneで 済むようになり、財布を出す機会が激減しました。

ただ、お店で支払うとき、「QUICPayで」などと言わないといけないのが ちょっと面倒です。というか、お店のひとが大変そうに見えます。
(セルフだと、「電子マネー」→「その他」→「QUICPay」といった具合に 選択するのが、若干ですが面倒に思っています。)

電子マネーの種類が星の数ほどあるので難しいというのは想像がつきます が、なんとかがんばっていただき、どんな電子マネーでもいきなりかざす だけで済むようにしてほしいなと思います。

そして、居酒屋などで割り勘にするとき、全員がかざすと均等に支払いを 済ませてくれると、あーだこーだしなくてよいのではないかと思います。

という具合で、一見すると、電子マネーを使いこなしているようですが、 実際は、買い物のとき必ず財布も持っていきます。小心者です。
(あと、「QUICPayで」と言うタイミングがわからなくて緊張します。)

いつの日か、iPhoneだけを持って買い物に行ける日がくることを夢見つつ、 今回も張り切ってまいりたいと思います。

今回のお題 - nginxを触ってみよう (レベル:初級)

Webサーバと言えば「Apache HTTP Server」だと思っていましたが、少し 前から、「nginx」に首位の座を明け渡しているようです。
(そういえば、CentOS8の本でも、そんなことを章の始めに書きました。)


Usage Statistics and Market Share of Web Servers, June 2022
https://w3techs.com/technologies/overview/web_server
May 2022 Web Server Survey | Netcraft News
https://news.netcraft.com/archives/2022/05/30/may-2022-web-server-survey.html


パフォーマンスやセキュリティなどをあまり考慮する必要がなく、お試し で動かすだけなら、慣れたApacheでちょちょいと動してしまいがちです。
しかし、我々技術者は、同じ場所にとどまっていてはいけません。新しい (と言えないかもしれませんが)ものをどんどん取り入れる必要があります。

というわけで今回は、「nginx」を少し触ってみたいと思います。
確認したのは「Ubuntu 18.04」「Ubuntu 20.04」ですが、他でもだいたい 同じように設定できると思います。

nginxとは

「nginx(エンジンエックス)」は、効率よく高速に動作するよう開発されて いるオープンソースのWebサーバです。動的なコンテンツは別におまかせ して、静的なコンテンツを高速に処理することを目指しています。


nginx news
https://nginx.org/


ということは、フロントにnginxが使われていて首位になっているのかな?
と憶測してしまいますが、もし仮にそうだとしても、実績が十分なことに 間違いはありません。

さて、nginxを使うには、同名のパッケージをインストールします。
(たいていのディストリビューションにはパッケージがあります。) Debian系だと下記の通りです。

$ sudo apt install nginx   

サービスは自動で起動したりはしないようです。(私の環境ではApacheが すでにあるため自動起動しないのかもしれません。) もし動いていたら、念のため止めておいてください。

$ sudo systemctl stop nginx.service   

nginxの設定ファイル

設定ファイルは「/etc/nginx」以下にあります。
Ubuntu の場合、だいたい下記のようになっていました。

/etc/nginx   
├── nginx.conf        ... メインの設定ファイル 
├── mime.types        ... MIMEタイプと拡張子の対応表 
├── conf.d            ... 設定ファイル置き場(ただし空っぽ) 
├── modules-available ... モジュール関連で使用可能な設定ファイル置き場(空っぽ) 
├── modules-enabled   ... モジュール関連の設定ファイル置き場(いくつかあり) 
├── sites-available   ... サイト固有の指定可能な設定ファイル置き場 
│   └── default       ... デフォルトのサイト固有の設定ファイル 
├── sites-enabled     ... サイト固有の設定ファイル置き場 
│   └── default       ... 「sites-available/default」のシンボリックリンク 
├── snippets   
│   ├── fastcgi-php.conf ... fastcgiとphpの設定(読み込まれない) 
│   └── snakeoil.conf ... httpsで自己証明したときに必要な設定(読み込まれない) 
├── fastcgi.conf      ... fastcgiの設定ファイル(読み込まれない) 
├── fastcgi_params    ... fastcgiのパラメータ(内容は上記とほぼ同じ) 
├── proxy_params      ... proxyのパラメータ(読み込まれない) 
├── scgi_params       ... scgiのパラメータ(読み込まれない) 
├── uwsgi_params      ... uwsgiのパラメータ(読み込まれない) 
├── koi-utf           ... koi8-r(ロシア語の文字コード)←→utf-8の変換表 
├── koi-win           ... koi8-r←→windows-1251(キリル語の文字コード)の変換表 
└── win-utf           ... windows-1251←→utf-8の変換表 

最初に読み込まれる設定ファイルが「/etc/nginx/nginx.conf」です。
基本的な設定と、他の設定ファイルの読み込みを行っています。
サイトごとの設定は「/etc/nginx/sites-enabled」に置きます。
「default」がデフォルトの設定ファイルです。待ち受けるポート番号や ドキュメントルートの設定があります。

設定ファイルには、設定を指示する「ディレクティブ」が延々と記されて います。
下記は、nginx.confの冒頭部分です。単純なディレクティブだけでなく、 「{」と「}」(「ブロックディレクティブ」といいます)で囲んでいる部分 もあります。{}で囲んでいる部分を「コンテキスト」といいます。
(囲まれていない部分は「main」コンテキストです。)

user www-data;   
worker_process auto;   
pid /run/nginx.pid;   
include /etc/nginx/modules-enabled/*.conf;   
events {   
    worker_connections 768;   
}   

1行目の「user」ディレクティブで、nginxをどのユーザの権限で動かすか を指定します。Apacheと同様「www-data」ユーザを指定しています。

2行目の「worker_process」ディレクティブでは、実際の処理を担当する 「worker」プロセスの数を指定します。「auto」だとCPUコア数を指定した ことになります。

3行目の「pid」ディレクティブで、workerプロセスを管理する「master」 プロセスのプロセスIDを格納するファイルを指定します。

4行目の「include」ディレクティブで他の設定ファイルを読み込みます。

5〜7行目は「events」コンテキストの設定です。「worker_connections」 ディレクティブで、1つのworkerプロセスが処理する最大数を指定します。

まずは動かしてみる

説明はこのくらいにして、早速動かしてみましょう。
せっかくなので、「/etc/nginx/sites-enabled/default」を少し変更して 動かします。書き換えたい箇所を下記に示します。

server {   
    listen 80 default_server;   
    listen [::]:80 default_server;   
    (中略)   
    root /var/www/html;   
    (後略) 
}   

「listen」ディレクティブでは、待ち受けるポート番号(とIPアドレス)を 指定します。たとえば、「80」を「880」にしてみましょう。
そして、「root」ディレクティブでドキュメントルートを指定しますが、 すでにコンテンツが別のディレクトリにあるなら、これも変えてみます。

設定ファイルを書き換えるには、下記のように「sudo」コマンドを介して テキストエディタ(nano)を起動し、編集・保存します。
(以降も同様ですが、毎回書くと冗長になるので割愛します。)

$ sudo nano /etc/nginx/sites-enabled/default   

変更し終えたら、nginxを起動します。

$ sudo systemctl start nginx.service   

そしてWebブラウザで「http://localhost:880/」にアクセスし、nginxの ページ(Welcome to nginx!)か、意図したコンテンツが表示されれば問題 なく動作しています。
(Apacheがインストール済だと、Apacheのページになるかもしれません。
ポート番号が880であれば、nginxが動作しています。きっと。)

CGI(FastCGI)を動かす

せっかくなので、「CGI(Common Gateway Interface)」も動かしてみます。

nginxは、自身でCGIを動かす機能を持たず、CGIの機能を提供するサーバ との橋渡しを行う機能を備えています。
CGIの機能を提供するサーバとして、「fcgiwrap」を使ってみます。


GitHub - gnosek/fcgiwrap: Simple FastCGI wrapper for CGI scripts
https://github.com/gnosek/fcgiwrap


まずは、同名のパッケージをインストールします。
インストールすると、同名のサービスも自動で起動されます。

$ sudo apt install fcgiwrap   

次に、「/etc/nginx/sites-enabled/default」のserverコンテキスト内に 下記の設定を追加します。

    location ~ \.cgi$ {   
        fastcgi_pass unix:/var/run/fcgiwrap.socket;   
        include fastcgi.conf;   
    }   

拡張子が「cgi」のファイルを要求されたら、fcgiwrapが待ち受けている ソケット「/var/run/fcgiwrap.socket」を介して、fcgiwrapにCGIを起動 してもらう、という設定です。加えて、「/etc/nginx/fastcgi.conf」を 読み込みます。

上記設定を追加したら、nginxに設定ファイルの再読込をしてもらいます。

$ sudo systemctl reload nginx.service   

CGIスクリプトを用意します。たとえば、ドキュメントルート直下に下記 の内容の「hello.cgi」というファイルを用意します。

#!/bin/sh   
echo "Content-Type: text/plain"   
echo   
echo "Hello CGI World"   

ファイルを作ったら、実行のパーミッションを付与します。
(これを忘れると、「403 Forbidden」というエラーが発生します。)

$ chmod +x hello.cgi   

http://localhost:880/hello.cgi」にアクセスし、「Hello CGI World」 というそっけない1行が表示されることを確認します。

なお、拡張子でCGIを指定するのではなく、「/cgi-bin」以下のファイル をCGIとして動かすには、前述の「location」ディレクティブの引数を、 下記のように変更します。

    location /cgi-bin/ {   

おわりに

以上、nginxを超簡単に使ってみました。

Apacheと比べて、設定しないといけないことが大きく異なるわけではない ため、さほどうろたえることはないように思います。

ただ、何か機能を使おうとしたとき、nginxとは別のサーバが必要になる ので、その分、ひと手間かかるかもしれません。

そういうのもひっくるめて、色々楽しめばよいのではないかと思います。

宿題の答え

前回の宿題は、

tmuxの複数のペインでそれぞれ別の処理を行わせてみましょう。   

でした。

たとえば、ペインを2つ用意して、片方では「uptime」コマンドを、もう 片方では「vmstat」コマンドを実行し続けたいなら、下記のように実行し ます。

$ tmux new-session -d -s watch2 watch uptime   
$ tmux split-window watch vmstat   
$ tmux attach-session -t watch2   

1行目で「watch2」という名前のセッションを「new-session」で作成し、 「watch」コマンドを介して「uptime」を実行します。
(watchコマンドは、一定時間(2秒)ごとにコマンドを実行し続けます。)

2行目では、「split-window」で(ウィンドウを分割して)ペインを作り、 watchコマンドを介して「vmstat」コマンドを実行します。

最後の3行目で、「attach-session」によりセッションにつないで画面を 表示しています。

なお、「split-window」では、「-h」オプションで横に分割(デフォルト だと「-v」オプションの縦に分割)、「-p パーセント」オプションで分割 する割合を指定できます。(他にもたくさんオプションがあります。)

3つに分割し、「watch uptime」を小さく、「watch vmstat」を小さめ、 「tail -f /var/log/syslog」を大きめに表示したい場合は、下記を実行 してみてください。

$ tmux new-session -d -s watch3 uptime   
$ tmux split-window -p 80 tail -f /var/log/syslog   
$ tmux split-window -p 40 watch vmstat   
$ tmux attach-session -t watch3   

tmuxを終わらせるには、各ペインでCtrl+Cしていく…というのでもできる のですが、「kill-session」なら一発です。
(「kill-server」だと全部のセッションを終了します。)

$ tmux kill-session -t watch3   

今回の宿題

今回の宿題は、

nginxで複数のサイト(バーチャルホスト)を設定してみましょう。   

です。

特に説明していませんでしたが、「server」コンテキストを追加すれば、 1つのnginxで複数のサイト(バーチャルホスト)を動かせます。

サーバ名(「server_name」ディレクティブ)やポート番号を変えた設定を 追加して、いずれも動くことを確認してみてください。

…うーん、特にひねりのない宿題です…。OTZ

あとがき

しばらくその存在を失念していましたが、「インターネット・アーカイブ」 を久々に見る機会がありました。


Internet Archive: Digital Library of Free & Borrowable Books, Movies, Music & Wayback Machine
https://archive.org/


というのも、8ビットパソコンが全盛期の80年代に、猛威を振るっていた?
雑誌が、オンラインで読めることを知ったからです。
その雑誌とは、「マイコンBASICマガジン」です。


micomBASIC Magazine
https://archive.org/details/micombasic


パソコンというよりもBASICに興味を持った中高生のころ、毎月楽しみに していて、愛読していました。

当時、掲載されているBASICのコードを打ち込んで遊び、カセットテープ に記録したりしていました。(高校のころはフロッピーディスクでした。)

いくつか投稿して、載せていただいたこともありました。
こっ恥ずかしいですが、恥を忍んでここにさらしたいと思います。


micomBASIC Magazine (1988-06)
https://archive.org/details/micomBASIC-1988-06/page/156/mode/2up
micomBASIC Magazine (1986-02)
https://archive.org/details/micomBASIC-1986-02/page/126/mode/2up


「PASOPIA」というユーザの少ないマイナーな機種だったため、載る確率 が高かったのだろうと思います。

エミュレータがあったら、打ち込んで動かしたいところです。
死ぬまで働くつもりですが、もし老後があるなら、エミュレータを作って BASICのゲームを打ち込んで遊びたい、と思います。

老後なんて要らないと思っていましたが、あってもいいなぁ…。

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、7月3日に発行したいと思っております。

 

「いますぐ実践! Linux システム管理」はこちらです。
メルマガの解除、バックナンバーなども、以下からどうぞ。
https://www.usupi.org/sysad/ (まぐまぐ ID:149633)

その他、作者に関するページは、概ね以下にございます。
https://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
https://twitter.com/kuriking/ (twitter)
https://facebook.com/kuriking3 (facebook)
https://jp.pinterest.com/kuriking/pinterest)
https://www.instagram.com/kuri_king_/ (instagram)


[バックナンバーのトップへ] [Linux システム管理のトップへ]


トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ 本が出ますよ(栗イラストも!)
   

▼ リンク

Server World
各種ディストリビューションの設定例がてんこ盛りです。
日経Linux
今や数少なくなってしまったLinuxの雑誌。
Linux & OSS − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
OSDN Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
Linux Development - IBM Developer
開発者向けですが、勉強になりますよ。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)

▼ 作ってみました

▼ 最近読んだ本

風に舞い上がるビニールシート
森絵都
  どれもいい意味で裏切られます。
ハマス・パレスチナ・イスラエル
飯山陽
  重複が多いので圧縮したい。
「ひとりが好きな人」の上手な生き方
Thibaut Meurisse
  この路線でがんばろうと思える。
最後は臼が笑う
森絵都
  すぐ読み終わる。面白い。
マンガでわかる!情報整理術超入門
岡野純
  わかりやすい。そうかタブかあ。
Obsidianで”育てる”最強ノート術
増井敏克
  Obsidianはよいです。もっと活用せねば。
虐げられた人びと
ドストエフスキー
  なんか身も蓋もない。
ドイツ戦歿学生の手紙
Philipp Witkop
  わだつみ本のドイツ版。最後の文が。
きけ わだつみのこえ-日本戦没学生の手記
日本戦没学生記念会
  なくしたので再度買いました。
安倍晋三回顧録
安倍晋三他
  すごいひとだったんだなあと。

▼ 気に入ってる本

Ship It! ソフトウェアプロジェクト成功のための達人式ガイドブック
Jared Richardson, William Gwaltney Jr.
  いろんな分野に適用したい
Java並行処理プログラミング
Brian Goetz, Joshua Bloch, Doug Lea
  Javaや並行処理を甘く見てました
ビジュアライジング・データ - Processingによる情報視覚化手法
Ben Fry
  Processingすごくよいです
センネン画報その2
今日マチ子
  前作もよいがもっといい!
出現する未来
Peter Senge, C. Otto Scharmer, Joseph Jaworski, Betty Sue Flowers
  難しいけど到達したいです
図解 実戦マーケティング戦略
佐藤 義典
  栗日記も戦略的に行こう!
百日紅(上)(下)
杉浦日向子
  どう書けばいいかわからないけどすばらしい!
アルケミスト
パウロ・コエーリョ
  擦り切れるほど読んでます
X51.ORG THE ODYSSEY
佐藤 健寿
  X51.ORGの集大成
影響力の武器
ロバート・B・チャルディーニ
  思わず納得します

▼ せんでん