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)






