NPCA夏合宿 2014 講義資料

Post on 31-May-2015

351 views 4 download

description

灘校パソコン研究部 2014年度夏合宿で行った講義の資料です

Transcript of NPCA夏合宿 2014 講義資料

NPCA 合宿講義2014年夏合宿

アジェンダ

• Linuxをさわってみよう

• Webサーバーを構築してみよう

• Webサーバーを作ってみよう

Linuxをさわってみよう

Linuxとは

• カーネル / オペレーティングシステムの1つ

• Open Source Software 

• だれでも自由に使える

• Linus Torvaldsが1991年から開発を始めた

Linuxディストリビューション

• Linuxをベースとして様々なソフトウェアをまとめたもの

• Linuxカーネル + デスクトップシステムなど

• Androidもディストリビューションの1つという場合もある

Linuxディストリビューション

• Debian

• Debian, Ubuntu, KNOPPIX, ...

• Red Hat Enterprise Linux (RHEL)

• Fedora, CentOS, Scientific Linux, ...

• Gentoo Linux, Arch Linux, ...

今回使う環境

• Ubuntu Server 14.04 64 bit 

• Amazon EC2 t2.micro 

• RAM: 8GB 

• Tokyo Region

SSHをしてみよう

• IP Addresses: http://goo.gl/mCPZSR 

• Username: ubuntu 

• SSH Private Key: http://goo.gl/1mz2Ns 

• Download Credential: npca / ab728b6e

SSHをしてみよう

• Windows 

• Putty → めんどくさいのでPoderosa / TeraTermをいれてください

SSHをしてみよう• Windows 

• TeraTerm 

SSHをしてみよう• Windows 

• Poderosa 

SSHをいれてみよう

• Linux / Mac OS X 

• chmod 400 d1ceb583620732b5ff2a037ac2a9e4d6.pem 

• ssh -i d1ceb583620732b5ff2a037ac2a9e4d6.pem ubuntu@<ip addr>

シェルを使ってみよう

• シェルとは

• 様々なプログラム(コマンド)へのインターフェース

• プログラマブル

シェルを使ってみよう

• Linuxでの操作は基本的にシェルをベースにしたもの

• ファイル操作

• 設定変更

• プログラミング

シェルを使ってみよう

• bash (バッシュ)

• 様々なLinuxディストリビューションで使われているシェル

• 今回の環境でもbashが使われている

• 他にもcsh, zshなど

基本コマンドを覚えよう

• 基本コマンドを覚えよう

• これが使えないとなにもできない

基本コマンドを覚えよう

• はじめに - 様々なエイリアス

• . - 現在いるディレクトリを表す

• .. - 現在いるディレクトリの1つ上のディレクトリを表す

• ~ - ホームディレクトリを表す

基本コマンドを覚えよう

• ls - list directory contents 

• ls <ディレクトリ名 / ファイル名>

• ディレクトリの中身を一覧表示

基本コマンドを覚えよう• ls - list directory contents 

• オプション

• -a .で始まるファイルも表示

• -l 詳細表示

• -h ファイルサイズをわかりやすく表示

基本コマンドを覚えよう• ls - list directory contents 

• ls -alh ~

total 28Kdrwxr-xr-x 4 ubuntu ubuntu 4.0K Aug 14 15:41 .drwxr-xr-x 3 root root 4.0K Aug 14 15:33 ..-rw-r--r-- 1 ubuntu ubuntu 220 Apr 9 01:03 .bash_logout-rw-r--r-- 1 ubuntu ubuntu 3.6K Apr 9 01:03 .bashrcdrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:41 .cache-rw-r--r-- 1 ubuntu ubuntu 675 Apr 9 01:03 .profiledrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:33 .ssh

基本コマンドを覚えよう• ls - list directory contents 

• ls -alh ~

total 28Kdrwxr-xr-x 4 ubuntu ubuntu 4.0K Aug 14 15:41 .drwxr-xr-x 3 root root 4.0K Aug 14 15:33 ..-rw-r--r-- 1 ubuntu ubuntu 220 Apr 9 01:03 .bash_logout-rw-r--r-- 1 ubuntu ubuntu 3.6K Apr 9 01:03 .bashrcdrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:41 .cache-rw-r--r-- 1 ubuntu ubuntu 675 Apr 9 01:03 .profiledrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:33 .ssh

ディレクトリかどうか

基本コマンドを覚えよう• ls - list directory contents 

• ls -alh ~

total 28Kdrwxr-xr-x 4 ubuntu ubuntu 4.0K Aug 14 15:41 .drwxr-xr-x 3 root root 4.0K Aug 14 15:33 ..-rw-r--r-- 1 ubuntu ubuntu 220 Apr 9 01:03 .bash_logout-rw-r--r-- 1 ubuntu ubuntu 3.6K Apr 9 01:03 .bashrcdrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:41 .cache-rw-r--r-- 1 ubuntu ubuntu 675 Apr 9 01:03 .profiledrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:33 .ssh

ファイルサイズ

基本コマンドを覚えよう• ls - list directory contents 

• ls -alh ~

total 28Kdrwxr-xr-x 4 ubuntu ubuntu 4.0K Aug 14 15:41 .drwxr-xr-x 3 root root 4.0K Aug 14 15:33 ..-rw-r--r-- 1 ubuntu ubuntu 220 Apr 9 01:03 .bash_logout-rw-r--r-- 1 ubuntu ubuntu 3.6K Apr 9 01:03 .bashrcdrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:41 .cache-rw-r--r-- 1 ubuntu ubuntu 675 Apr 9 01:03 .profiledrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:33 .ssh

最終更新日時

基本コマンドを覚えよう• ls - list directory contents 

• ls -alh ~

total 28Kdrwxr-xr-x 4 ubuntu ubuntu 4.0K Aug 14 15:41 .drwxr-xr-x 3 root root 4.0K Aug 14 15:33 ..-rw-r--r-- 1 ubuntu ubuntu 220 Apr 9 01:03 .bash_logout-rw-r--r-- 1 ubuntu ubuntu 3.6K Apr 9 01:03 .bashrcdrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:41 .cache-rw-r--r-- 1 ubuntu ubuntu 675 Apr 9 01:03 .profiledrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:33 .ssh

ファイル / ディレクトリ名

基本コマンドを覚えよう• ls - list directory contents 

• ls -alh ~

total 28Kdrwxr-xr-x 4 ubuntu ubuntu 4.0K Aug 14 15:41 .drwxr-xr-x 3 root root 4.0K Aug 14 15:33 ..-rw-r--r-- 1 ubuntu ubuntu 220 Apr 9 01:03 .bash_logout-rw-r--r-- 1 ubuntu ubuntu 3.6K Apr 9 01:03 .bashrcdrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:41 .cache-rw-r--r-- 1 ubuntu ubuntu 675 Apr 9 01:03 .profiledrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:33 .ssh

所有ユーザー 所有グループ

ユーザーとグループとは

• ユーザーは1つ以上のグループに所属する

• 1つ1つのユーザーに対して細かく設定するのはめんどくさい

• ユーザーを1つにグループにまとめてやりそのグループに対して設定を適用する

ユーザーとグループとは

• id - print real and effective user and group IDs 

• id <username> 

• ユーザのIDやそのユーザーが所属するグループを確認できる

ユーザーとグループとは• id - print real and effective user and group IDs 

• id ubuntu

uid=1000(ubuntu) gid=1000(ubuntu)groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo), 29(audio),30(dip),44(video),46(plugdev),102(netdev)

ユーザーとグループとは• id - print real and effective user and group IDs 

• id ubuntu

uid=1000(ubuntu) gid=1000(ubuntu)groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo), 29(audio),30(dip),44(video),46(plugdev),102(netdev)

ユーザー メイングループ

ユーザーとグループとは• id - print real and effective user and group IDs 

• id ubuntu

uid=1000(ubuntu) gid=1000(ubuntu)groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo), 29(audio),30(dip),44(video),46(plugdev),102(netdev)

所属グループ

基本コマンドを覚えよう• ls - list directory contents 

• ls -alh ~

total 28Kdrwxr-xr-x 4 ubuntu ubuntu 4.0K Aug 14 15:41 .drwxr-xr-x 3 root root 4.0K Aug 14 15:33 ..-rw-r--r-- 1 ubuntu ubuntu 220 Apr 9 01:03 .bash_logout-rw-r--r-- 1 ubuntu ubuntu 3.6K Apr 9 01:03 .bashrcdrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:41 .cache-rw-r--r-- 1 ubuntu ubuntu 675 Apr 9 01:03 .profiledrwx------ 2 ubuntu ubuntu 4.0K Aug 14 15:33 .ssh

パーミッション

パーミッション

• Permission - 許可,承認

• だれがどのリソース(ファイルやディレクトリなど)にアクセスできるかを設定するもの

• セキュリティの最も基本となる部分

パーミッション• 所有ユーザー,所有グループ,全員の3項目に対して設定できる

-rwxrw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

所有ユーザーに対するパーミッション所有グループに対するパーミッション

その他全員に対するパーミッション

パーミッション• 読み込み権限,書き込み権限,実行権限の3種類がある

-rwxrw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

読み込み許可書き込み許可

実行許可 読み込み権限 = 4

書き込み権限 = 2

実行権限 = 1

として3桁の数で表すことも

この場合は741

パーミッション• まとめると,この場合は

-rwxrw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• ユーザーubuntuは読み込み,書き込み,実行ができる

• グループadmに所属するユーザーは読み込み,書き込みができる

• その他のユーザーは読み込みができる

パーミッション• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• これを3桁の数字で表すと?

• このファイルに書き込みができるユーザーは誰?

パーミッション• クイズ

-r-------- 1 ubuntu adm 220 Apr 9 01:03 file

• これを3桁の数字で表すと?

• このファイルに書き込みができるユーザーは誰?

パーミッション• クイズ

-r-x--x-wx 1 ubuntu adm 220 Apr 9 01:03 file

• これを3桁の数字で表すと?

• このファイルに書き込みができるユーザーは誰?

基本コマンドを覚えよう

• touch - change file timestamps 

• touch <ファイル名> 

• タイムスタンプの変更とかあるけど基本的に空のファイルを作るときにつかう

基本コマンドを覚えよう

• touch - change file timestamps 

• testという名前のファイルを作ってlsで確認してみよう

基本コマンドを覚えよう

• echo - display a line of text 

• echo <文字列> 

• 引数で与えた文字列を表示するだけの簡単なお仕事

リダイレクトを使ってみよう

• 基本的にコマンドの出力は表示されるだけ

• ファイルに保存したい時はどうする?

• リダイレクト!!!

リダイレクトを使ってみよう

• コマンド > 保存したいファイル名

• 簡単!

• コマンド >> 保存したいファイル名

• こうすると追記してくれる

リダイレクトを使ってみよう

• 逆にファイルから入力したい時はどうする?

• コマンド < 入力ファイル

• JOIなどで必ず使います!!

リダイレクトを使ってみよう

• echoを使ってtestの中身をhogehogeにしてみよう

• リダイレクトを使うと簡単

• でもどうやって確認しよう

基本コマンドを覚えよう

• cat - concatenate and print files 

• cat <ファイル名> 

• ファイルの中身を出力

基本コマンドを覚えよう

• cat - concatenate and print files 

• testの中身を出力してみよう

基本コマンドを覚えよう

• head - output the first part of files 

• head <ファイル名>

• ファイルの先頭10行を表示

基本コマンドを覚えよう

• head - output the first part of files 

• オプション

• -n <N> 始めのN行を表示 

基本コマンドを覚えよう

• head - output the first part of files 

• head -n 15 /var/log/kern.log 

• cat /var/log/kern.logをしてみると違いがわかるはず

• ちなみに/var/log/kern.logはカーネルが出力したメッセージ

基本コマンドを覚えよう

• tail - output the last part of files 

• tail <ファイル名>

• ファイルの末尾10行を表示

基本コマンドを覚えよう

• tail - output the last part of files 

• オプション

• -n <N> 最後のN行を表示

• -f ファイルを監視して,末尾に追記される度に出力

基本コマンドを覚えよう

• tail - output the last part of files 

• tail -f /var/log/auth.log 

• SSHでもう1接続してみると更新されているのがわかるはず

基本コマンドを覚えよう

• grep - print lines matching a pattern 

• grep <パターン> <ファイル名>

• ファイルの中からパターンにマッチするものを出力

• ファイル名が省略された場合は標準出力から読み込む

基本コマンドを覚えよう

• grep - print lines matching a pattern 

• 正規表現

• パターンに正規表現を使うことでより高度な検索が

• 例えば,IPアドレスの形式にマッチするものを検索とか

基本コマンドを覚えよう

• grep - print lines matching a pattern 

• grep ubuntu /var/log/auth.log 

• auth.logの中でubuntuという文字列を含む行だけ出力

パイプを使ってみよう

• grepはファイル名を省略したときは,標準入力から読み込む

• grep ubuntu < /var/log/auth.log 

• auth.logの先頭10行の中でubuntuという文字を含む部分を抜き出したい時は?

パイプを使ってみよう• さっきのheadとリダイレクトを使えばよさそう!

• head /var/log/auth.log > output_file 

• grep ubuntu output_file 

• grep ubuntu < output_file 

• 正解,でももっと簡単に

パイプを使ってみよう

• パイプを使ってみる

• head /var/log/auth.log | grep ubuntu 

• パイプ | を使うと,前のコマンドの出力がそのまま次のコマンドの入力となる

パイプを使ってみる

• クイズ

• パイプを使って

• grep ubuntu /var/log/auth.logと同じ出力をする

• コマンドを実行してください

パイプを使ってみる

• 答え

• cat /var/log/auth.log | grep ubuntu 

基本コマンドを覚えよう

• cp - copy files and directories 

• cp <ファイル名> <新しいファイル名>

• ファイル / ディレクトリをコピーする

基本コマンドを覚えよう

• cp - copy files and directories 

• オプション

• -r ディレクトリのときはr(ecursive)オプションが必要

基本コマンドを覚えよう

• cp - copy files and directories 

• testファイルをtest_copyファイルにコピーしてみよう

基本コマンドを覚えよう

• mv - move (rename) files 

• mv <ファイル名> <新しいファイル名>

• ファイル / ディレクトリを移動する = ファイル名を変更する

基本コマンドを覚えよう

• mv - move (rename) files 

• testファイルをtest_newに名前を変更してみよう

基本コマンドを覚えよう

• rm - remove files or directories 

• rm <ファイル名>

• ファイル / ディレクトリを削除する

基本コマンドを覚えよう

• rm - remove files or directories 

• オプション

• -r ディレクトリのときはr(ecursive)オプションが必要

• -f 有無を言わさず消す!!

基本コマンドを覚えよう

• rm - remove files or directories 

• test_copyファイルを削除してみよう

基本コマンドを覚えよう

• chmod - change file mode bits 

• chmod <パーミッション> <ファイル名>

• ファイルのパーミッションを変更する

基本コマンドを覚えよう

• chmod - change file mode bits 

• オプション

• -r ディレクトリ以下のすべてのファイルを変更したい時は r(ecursive)オプションが必要

基本コマンドを覚えよう

• chmod - change file mode bits 

• パーミッションの表記

• 3桁の数字 - 755, 644とか

• 文字列で表記

基本コマンドを覚えよう

• chmod - change file mode bits 

• chmod u=rwx file 

• 所有ユーザーにrwx(読み込み,書き込み,実行)権限を付与

基本コマンドを覚えよう

• chmod - change file mode bits 

• chmod g+rx file 

• 所有グループに所属するユーザーにいま与えられている権限 + rx(読み込み,実行)権限を付与

基本コマンドを覚えよう

• chmod - change file mode bits 

• chmod o-rx file 

• それ以外のユーザーに対していま与えられている権限からr(読み込み)権限を剥奪

基本コマンドを覚えよう

• chmod - change file mode bits 

• chmod a=rwx file 

• すべてのユーザーにrwx(読み込み,書き込み,実行)権限を付与

• すべてのユーザーのときはaを省略できる

基本コマンドを覚えよう• クイズ

• こういうファイルがあります-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

基本コマンドを覚えよう• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• chmod +rw をするとパーミッションはどうなる?

基本コマンドを覚えよう• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• chmod +rw をするとパーミッションはどうなる?

• 答え 666 (rw-rw-rw-)

基本コマンドを覚えよう• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• chmod g-wx をするとパーミッションはどうなる?

基本コマンドを覚えよう• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• chmod g-wx をするとパーミッションはどうなる?

• 答え 644 (rw-r--r--)

基本コマンドを覚えよう• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• chmod o=wx をするとパーミッションはどうなる?

基本コマンドを覚えよう• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• chmod o=wx をするとパーミッションはどうなる?

• 答え 663 (rw-rw--wx)

基本コマンドを覚えよう• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• chmod u+x をするとパーミッションはどうなる?

基本コマンドを覚えよう• クイズ

-rw-rw-r-- 1 ubuntu adm 220 Apr 9 01:03 file

• chmod u+x をするとパーミッションはどうなる?

• 答え 764 (rwxrw-r--)

基本コマンドを覚えよう

• chmod - change file mode bits 

• test_newの書き込み権限を剥奪してみよう

• echo hogehoge > test_newってするとどうなる?

• rm test_newはどうなる?

基本コマンドを覚えよう

• chown - change file owner and group 

• chown <ユーザー> <ファイル名>

• ファイルの所有者情報を変更する

基本コマンドを覚えよう

• chown - change file owner and group 

• オプション

• -r ディレクトリ以下のすべてのファイルを変更したい時は r(ecursive)オプションが必要

基本コマンドを覚えよう

• chown - change file owner and group 

• chown ubuntu file 

• 所有ユーザーがubuntuになる

基本コマンドを覚えよう

• chown - change file owner and group 

• chown ubuntu:adm file 

• 所有ユーザーがubuntuになる

• 所有グループがadmになる

基本コマンドを覚えよう

• chown - change file owner and group 

• chown ubuntu. file 

• 所有ユーザーがubuntuになる

• 所有グループがubuntuになる

基本コマンドを覚えよう

• pwd - print name of current/working directory 

• pwd 

• 現在いるディレクトリの名前がわかる

基本コマンドを覚えよう

• wget - The non-interactive network downloader 

• wget <URL> 

• ネットワーク上のファイルを落としてくる

• HTTP / HTTPS / FTP

基本コマンドを覚えよう

• wget - The non-interactive network downloader 

• オプション

• -O <ファイル名> 保存するファイル名を設定

• -r URL以下のファイルを全部取ってきてくれる (便利!!)

基本コマンドを覚えよう

• wget - The non-interactive network downloader 

• wget http://www.npca.jp/ 

• index.htmlをcatしてみよう

基本コマンドを覚えよう

• exit 

• 終了する

エディタを使ってみよう

• SSHで作業するときはコンソールで動くエディタを使う

• vim / nano / emacs / ed / acme 

• この講義ではvim / nanoをおすすめします

エディタを使ってみよう

• とりあえず起動

• vim 

• あとは自分でがんばってくれ

• http://www15.ocn.ne.jp/~tusr/vim/vim_text0.html

エディタを使ってみよう

• vimにはいくつかモードがある

• 挿入モード

• 普通に入力する時のモード

• 押した文字が挿入される

エディタを使ってみよう

• vimにはいくつかモードがある

• コマンドモード

• 「開く」「保存」とか普通のエディタだとマウスで行う部分

エディタを使ってみよう

• vimにはいくつかモードがある

• ノーマルモード

• 起動直後の状態

• ここからコマンドモードや挿入モードに移行する

エディタを使ってみよう

• とりあえず終了する

• :q 

• ノーマルモードで:を打つとコマンドモードになる

• :qはquitの意

エディタを使ってみよう

• もう一回起動する

• vim

エディタを使ってみよう

• 今度は挿入モードに移行する

• i 

• iと打つと下に-- INSERT --と表示されるはず = 挿入モード

• テキストを編集できるように

エディタを使ってみよう

• ノーマルモードに戻る

• Esc 

• 下の-- INSERT --が消える

エディタを使ってみよう

• 文字の削除

• ノーマルモードでxと打つと文字が削除される

• 悪いことは言わないのでとりあえずBackspaceとDelを使っとけ

• 挿入モード中で使えるので楽

エディタを使ってみよう

• カーソル移動

• ノーマルモードでh, j, k, lと打つとカーソルが移動する

• 悪いことは言わないのでとりあえずカーソルキーを使っとけ

• 挿入モード中で使えるので楽

エディタを使ってみよう

• ファイルに保存する

• ノーマルモードに戻ってから

• :w <ファイル名>

• 上書き保存の時はファイル名を省略できる

エディタを使ってみよう

• ファイルを開く

• :o <ファイル名>

• シェルから起動するときにvim <ファイル名>としても一緒

エディタを使ってみよう

• 上書き保存して終了

• :wq 

• 保存せず終了

• :q!

エディタを使ってみよう

• まとめ

• ビジュアルモードとかもある

• ある程度のコマンドを覚えるまでがんばるのみ

コンパイルしてみよう• これでコードを書く環境が整った!!

• vim main.cで以下のコードを書いてみよう#include <stdio.h>

int main(void){printf(“Hello, world!\n”);return 0;

}

コンパイルしてみよう

• コンパイルしてみよう

• どうやって?

コンパイルしてみよう

• gcc - GNU project C and C++ compiler 

• gcc <ファイル名>

• C言語のソースコードをコンパイルする

コンパイルしてみよう• gcc - GNU project C and C++ compiler 

• オプション

• -o <ファイル名> 出力するファイル名 (指定しないとa.out)

• -O1, -O2, -O3 最適化レベル (つけると自動的に高速化)

• その他にもいっぱい重要なものがある

コンパイルしてみよう

• gcc main.c -o main 

• エラーが出たら修正しましょう

コンパイルしてみよう

• ./main 

• ファイルを実行するときは./などを付けないといけない

• 付けていないとコマンドだと思って探しに行く

• コマンドじゃないことを知らせればいいので/home/ubuntu/mainとかでも実行できる

休憩

Webサーバーを構築してみよう

そもそもサーバーって?

• サービスを提供するもの

• ビールサーバー→ビールを提供する

• Webサーバー→Webを提供する(?

Webサーバーって?

• Webコンテンツを提供するソフトウェア

• ユーザーからのあるファイルを見たいというリクエストを受けそのファイルがあれば返す

• HTTPというプロトコルを用いている

Webサーバーって?

• すべてのWebコンテンツはWebサーバーで提供されている

• GoogleにもNPCAにもWebサーバーがあるからWebサイトが提供できている

• 一般的には80番ポートを使うことが多い

Webサーバーと話してみよう• NPCAのWebサーバーに接続してHTTPで話してみよう

• nc www.npca.jp 80 

• 繋がったら以下のとおり入力 (最後に改行2回)

GET / HTTP/1.1

Host: www.npca.jp

Webサーバーと話してみよう

• たくさんの文字が流れてきたはず

• 大部分はhttp://www.npca.jp/の中身

• 最初の方にServer: Apacheという文字列があるはず

• NPCAのWebサーバーはApacheというソフトウェア

Webサーバーを構築してみよう

• このApacheを構築してみよう

• とりあえずApacheをインストールしてみよう

aptを使ってみよう

• どうやってインストールする?

• 公式サイトからインストーラーを落としてくる?

aptを使ってみよう

• パッケージマネージャを使ってみよう

• コマンドラインから簡単にインストールできるシステムが用意されている

• ソフトウェアをパッケージにまとめて提供している

aptを使ってみよう

• パッケージマネージャを使ってみよう

• Ubuntuの場合は apt を使うのがメジャー

• ディストリビューションによって異なる

aptを使ってみよう

• apt-get - APT package handling utility 

• apt-get <コマンド> <オプション>

aptを使ってみよう

• apt-get - APT package handling utility 

• apt-get install <パッケージ名>

• パッケージをインストールする

aptを使ってみよう

• apt-get - APT package handling utility 

• apt-get remove <パッケージ名>

• パッケージをアンインストールする

aptを使ってみよう

• apt-get - APT package handling utility 

• apt-get purge <パッケージ名>

• 設定ファイルを含めてアンインストールする

aptを使ってみよう

• apt-get - APT package handling utility 

• apt-get update 

• 最新のパッケージ情報をインターネットから取得する

• どのバージョンのパッケージが入手可能なのかなど

aptを使ってみよう

• apt-get - APT package handling utility 

• apt-get upgrade 

• インストール済みのパッケージを最新のバージョンに更新

aptを使ってみよう

• apt-get - APT package handling utility 

• apt-get autoremove 

• 不要なパッケージを自動的に削除

aptを使ってみよう

• Apacheをインストールしてみよう

• Apacheのパッケージ名はapache2

• apt-get install apache2

aptを使ってみよう

• こんなエラーが出るはずE: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

• 管理者権限が必要

rootとは

• 管理者アカウントの名前はroot

• WindowsでいうAdministrator

• システムに変更を加えるときにはrootの権限が必要

rootとは

• sudo - execute a command as another user 

• sudo <コマンド>

• コマンドをrootとして実行できる

rootとは

• sudo - execute a command as another user 

• sudo id 

uid=0(root) gid=0(root) groups=0(root)

aptを使ってみよう

• sudo apt-get install apache2 

• 確認のメッセージが出るので y を押す

• これでインストールができるはず

Webサーバーを構築してみよう

• ブラウザでアクセスしてみよう

• IPアドレスはSSHと一緒

• これで繋がるはず

Webサーバーを構築してみよう

• サーバー構築で一番重要なこと

• 問題解決能力

• 問題の原因を切り分けて修正すること

つながらない問題

• とりあえずサーバーにつながってない状況

• 原因として考えられることは?

• 思いつく限り挙げてみよう

繋がらない問題

• そもそもこの部屋がインターネットにつながってない

• サーバーの電源が落ちた

• サーバーがインターネットにつながってない

繋がらない問題

• Apacheが起動していない

• service apache2 statusで確認してみよう

• ネットワーク設定に何か問題がある

繋がらない問題

• とりあえずサーバー内部から接続してみる

• nc localhost 80 

GET / HTTP/1.1

Host: localhost

繋がらない問題

• なんかいろいろ返ってきた

• サーバー内部からは繋がる

• 外部からは繋がらない

繋がらない問題

• ファイアーウォール

• 外部との接続を遮断するソフトウェア

• 侵入や情報漏洩を防ぐのに重要

繋がらない問題

• ファイアーウォールに対してWebサーバーは自分が構築したものだから遮断しなくてよいと設定してやらなければならない

• 現在 Ubuntu で使われているソフトウェアは ufw

繋がらない問題

• sudo ufw allow http 

• これでhttpの接続(tcp 80)を許可する

• もう一回ブラウザからアクセスしてみよう

Apacheの設定を変更してみよう

• とりあえずApacheの設定をいじってみよう

• 公開するディレクトリを変更しよう

Apacheの設定を変更してみよう• Apacheの設定は/etc/apache2/以下にある

• 基本的な設定は/etc/apache2/apache2.conf

• 細かな機能(モジュール)についての設定は/etc/apache2/mods-available/にある

• mods-enabled/にシンボリックリンク(ショートカット)を作ると有効化される

Apacheの設定を変更してみよう

• Apacheの設定は/etc/apache2/以下にある

• それぞれのWebサイトに関する設定は/etc/apache2/sites-available/にある

• sites-enabled/にシンボリックリンクを作ると有効化される

• 今回変更するのは/etc/apache2/sites-available/000-default.conf

Apacheの設定を変更してみよう

• まずホームディレクトリでmkdir www

• そして~/wwwを公開するディレクトリに設定する

Apacheの設定を変更してみよう

• root権限で/etc/apache2/sites-available/000-default.confを開く

• DocumentRoot /var/www/htmlを

• DocumentRoot /home/ubuntu/wwwに変更する

Apacheの設定を変更してみよう

• root権限で/etc/apache2/sites-available/000-default.confを開く

• DocumentRootの下に以下の項目を追加

<Directory /home/ubuntu/www>Require all granted

</Directory>

Apacheの設定を変更してみよう

• Apacheに設定を適用する

• root権限でservice apache2 reload

HTMLを書いてみよう

• とりあえずWebサーバーは建てた

• じゃあWebコンテンツを置いてみよう

HTMLを書いてみよう

• HTML - Hyper Text Markup Language 

• Web上のコンテンツは基本的にHTMLで書かれている

HTMLを書いてみよう• vim /home/ubuntu/www/index.html 

<!DOCTYPE html><html><head><title>Hello, world!</title></head><body><p>Hello, world!</p></body></html>

HTMLを書いてみよう

• 細かな説明は省略

• 基本的に「<タグ>中身</タグ>」が入れ子構造になっている

• ブラウザでアクセスして表示されているか見てみよう

HTMLを書いてみよう

• <p>となっている部分を<h1>や<h6>にすると大きさが変わる

• <marquee>がアツい

• これ以上の装飾にはCSSを勉強する必要がある

休憩

Webサーバーを作ってみよう

はじめに

• GitHubアカウントは持っていますか

• 持っていない人は1分以内に作ってください

• 持ってる人は2段階認証を有効にすることをおすすめします

今回使う材料がこちらです

• https://github.com/hiromu/simple-web-server 

• とりあえずforkする

• 人のリポジトリに改変を加えて公開したいときはforkを使うと便利

SSH Public Keyの登録

• サーバーからGitHubにアクセスできるようにSSHキーを登録する

• ssh-keygen 

• cat ~/.ssh/id_rsa.pub → コピー

SSH Public Keyの登録• SettingsのSSH KeysでAdd SSH Key

• https://help.github.com/articles/generating-ssh-keys

Gitの設定

• git config --global user.name <名前>

• git config --global user.email <メールアドレス>

Git cloneしてみよう

• ソースコードをcloneする

• ホームディレクトリでgit clone git@github.com:<ユーザー名>/simple-web-server.git

Web Serverを起動してみよう

• とりあえずWeb Serverを起動するときにめんどくさいのでファイアーウォールを無効化する

• sudo ufw disable 

• ※よい子は真似しないでね

Web Serverを起動してみよう

• cd simple-web-server 

• make 

• ./server <適当なポート>

• ブラウザで http://<IPアドレス>:<ポート>/ にアクセスしてみる

makeとは

• makeと打つと自動的にビルドしてくれた

• makeはコンパイルを自動化するソフトウェア

• Makefileに基づいてビルドしてくれる

makeとは• cat Makefile

CC = gcc

CFLAGS = -WallLDFLAGS =

TARGET = serverOBJS = main.o server.o util.o

all: $(TARGET)

server: $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS)

.c.o: $(CC) $(CFLAGS) -c $< -o $@

clean: rm $(TARGET) $(OBJS)

設定などを変数に代入CC: ビルドにはgccを使うCFLAGS: コンパイル時にはCFLAGSをオプションとするLDFLAGS: リンク時にはLDFLAGSをオプションとする

デフォルトで$TARGETをビルド

serverをビルドするには$OBJSが必要

.cファイルを.oに変換するには以下の通り

オプションでcleanが指定されたら$TARGETと$OBJを削除

makeとは

• makeの前に./configureを実行することで環境に合わせたMakefileを自動生成するものも

• make, automake, autoconfなどは便利だけれども闇でもある

Web Serverを作ってみよう

• まずHTTPのプロトコルについて知ろう

• Web ServerはHTTPに則って通信を行う

• プロトコルを知らないとそもそも実装できない

HTTPについて学ぼう

• 基本的にリクエストとレスポンスがある

• ブラウザがリクエストを送りサーバーがそれに対してレスポンスを送る

Webブラウザ Webサーバーリクエスト

レスポンス

HTTPについて学ぼう

• リクエストは以下の形式に則っている

• <HTTPメソッド> <URI> <バージョン>

<ヘッダー名>: <ヘッダー値>

<本文>

HTTPについて学ぼう

• HTTPメソッドとは

• GET / POST / HEAD / PUT / DELETE 

• リクエストがどんな内容かということを示している

• 一般的に使うのはGETとPOST

HTTPについて学ぼう

• HTTPメソッドとは

• GET: Web上のリソースを取得(GET)するときに使う

• POST: Webサーバーに情報を送信(POST)するときに使う

• ログインフォームとかファイルアップロードとか

HTTPについて学ぼう

• URIとは

• Uniform Resource Identifier 

• どんなリソースが欲しいかを指定する

HTTPについて学ぼう

• URIとは

• 例えば http://www.npca.jp/about/ にアクセスするとURIには /about/ が入る

HTTPについて学ぼう

• HTTPバージョンとは

• HTTP/<メジャーバージョン>.<マイナーバージョン>の形式

• 現在は殆どがHTTP/1.1

• HTTP/2.0が策定中

HTTPについて学ぼう

• HTTPヘッダーとは

• 付随する様々な情報を送る

• ここに入る情報はユーザーが偽装できる!!

• 代表的なもののみ紹介

HTTPについて学ぶ

• Hostヘッダー

• Host: <ホスト名>という形式

• http://npca.jp/about/ にアクセスするとHost: npca.jpとなる

HTTPについて学ぶ

• Cookieヘッダー

• Cookie: <名前>=<値>; <名前>=<値>;という形式

• ログイン情報などユーザーに保存させている情報が送られる

HTTPについて学ぶ

• User-Agentヘッダー

• ユーザーがどのようなブラウザを使っているか送る

• Firefox 15 / WindowsだとMozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1

• ユーザーが偽装できるということをお忘れなく

HTTPについて学ぶ

• HTTPの本文とは

• POSTリクエストのときに送信する内容が含まれる

• ファイルアップロードだとmultipartというものが使われたり

• ヘッダーとは空行で区切られている

HTTPについて学ぶ• リクエストまとめ

• http://www.npca.jp/about/ にアクセスすると以下のようになる

GET /about/ HTTP/1.1Host: www.npca.jpUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 Chrome/36.0.1985.125

HTTPについて学ぶ

• クイズ

• http://www.google.com/#q=test にアクセスするとどうなる?

• CookieにSSID: AVK9Q7TrKu7WUyGcNと入っていたら?

HTTPについて学ぶ• 答え

GET /#q=test HTTP/1.1Host: www.google.comUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36Cookie: SSID=AVK9Q7TrKu7WUyGcN

HTTPについて学ぶ

• レスポンス

• <HTTPバージョン> <ステータスコード> <メッセージ>

<ヘッダー名>: <ヘッダー値>

<本文>

HTTPについて学ぶ

• HTTPバージョン

• さっきと同じ

• HTTP/1.1

HTTPについて学ぶ

• ステータスコードとメッセージ

• 404 Not Foundという文字列に見覚えが...?

HTTPについて学ぶ

• アクセスについての状況を3桁の数字とメッセージで示す

• 100番台 ~ 500番台まで

HTTPについて学ぶ

• 200 OK 

• 問題なくアクセスが完了した

HTTPについて学ぶ

• 301 Moved Permanently 

• 恒久的に移動した

• 302 Found 

• リダイレクト

HTTPについて学ぶ• 400 Bad Request 

• 不正なリクエスト

• 401 Unauthorized 

• 認証が必要である

• Basic認証などの際に表示される

HTTPについて学ぶ• 403 Forbidden 

• 禁止されている

• パーミッションの問題などの時

• 404 Not Found 

• 見つからない

HTTPについて学ぶ

• 500 Internal Server Error 

• サーバー内部のエラー

• 503 Service Unavailable 

• サーバーが落ちている

HTTPについて学ぶ

• HTTPヘッダー

• 基本的にリクエストと同じ

• 代表的なもののみ紹介

HTTPについて学ぶ

• Dateヘッダー

• 時刻を返す

• 複数形式での時刻の表現が許容されている

HTTPについて学ぶ

• Serverヘッダー

• Serverのソフトウェア情報などが入っている

• Apache, nginxなど

• ここにバージョンが含まれているとセキュリティ上のリスクがあると言われている

HTTPについて学ぶ

• Locationヘッダー

• 301, 302, 307などでリダイレクトするときにリダイレクト先を示す

HTTPについて学ぶ

• HTTP 本文

• HTMLの中身など

• ヘッダーとは空行で区切られている

HTTPについて学ぶ• レスポンスまとめ

• http://www.npca.jp/about/ にアクセスすると以下のようになるHTTP/1.1 200 OKHost: www.npca.jpDate: Thu, 14 Aug 2014 22:20:09 GMTServer: Apache

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE html><html lang="ja" xmlns="http://www.w3.org/1999/xhtml"> <!-- id: RS-02~a --> <head> <meta charset="utf-8" />.....

HTTPについて学ぶ• レスポンスまとめ

• http://www.npca.jp/about_/ にアクセスすると以下のようになるHTTP/1.1 404 Not FoundHost: www.npca.jpDate: Thu, 14 Aug 2014 22:20:09 GMTServer: Apache

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE html><html lang="ja" xmlns="http://www.w3.org/1999/xhtml"> <!-- id: RS-02~a --> <head> <meta charset="utf-8" />.....

HTTPについて学ぶ• レスポンスまとめ

• http://npca.jp/ にアクセスすると以下のようになる

HTTP/1.1 301 Moved PermanentlyDate: Thu, 14 Aug 2014 22:23:50 GMTServer: ApacheLocation: http://www.npca.jp/

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>301 Moved Permanently</title>.....

HTTPについて学ぶ

• これで君もバイリンガルだ!!

• HTTPでサーバーと会話してみよう

• ncでGoogleにアクセスしてみよう

• ncでwww.npca.jpにアクセスしてみよう

Web Serverを作ってみよう

• まず挙動を理解しよう

• ソースコードリーディング

ソースコードを読んでみよう

• 3つのファイルからなる

• main.c: Webサーバーとしての基本的な部分

• server.c: アクセスがあるとここが呼ばれる

• util.c: 便利な関数など

ソースコードを読んでみよう

• main.c 

• ちょっと難しいかも

• 基本的には指定されたポートでアクセスを待ちアクセスがあればhttp_server()を呼ぶ

ソースコードを読んでみる

• server.c 

• まずhttp_server()を見る

• 始めからutil.cのread_until()を読んでいる

ソースコードを読んでみる

• util.c 

• read_until()とはなにか

• 細かい実装は置いておいて

• 指定された文字が来るまで入力を読み込む

ソースコードを読んでみる

• server.c 

• まずスペースに達するまでmethodに文字を読み込む

• 読み込まれた文字がGETかPOSTでなければutil.cのresponse_header(“Not Implemented”)を呼ぶ

ソースコードを読んでみる

• util.c 

• response_header() 

• まず現在時刻を取得してasctimeで文字列に変換する

ソースコードを読んでみる

• util.c 

• response_header() 

• 引数に応じてHTTP/1.1 <ステータスコード> <メッセージ>を出力する

ソースコードを読んでみる

• util.c 

• response_header() 

• Date: <現在時刻>を出力する

• Server: <DEFINEされたSERVER_STRING>を出力する

ソースコードを読んでみる

• server.c 

• 次のスペースに達するまでURIに読み込み

• 256文字を超えるか正しく読み込めなければresponse_header(“Request-URI Too Long”)を呼ぶ

ソースコードを読んでみる

• server.c 

• 次のスペースに達するまでHTTP Versionに読み込み

• HTTP/1.1でなければ

response_header(“Version Not Supported”)を呼ぶ

ソースコードを読んでみる

• server.c 

• 空行に達するまでheaderを読み込む

• headerの行に:が含まれていなければresponse_header(“Bad Request”)を呼ぶ

ソースコードを読んでみる

• server.c 

• headerが終わればHTTP Methodに合わせてget()かpost()を呼ぶ

Webサーバーを作ってみよう

• とりあえず現在の出力の最後にHello, world!と出力されるようにしてみよう

• get()を変更してみよう

• 変更した後はmakeしてserverを起動

Webサーバーを作ってみよう

• 150行目にprintf(“Hello, world!\n”);を入れればOK

commitしてみよう

• 完成したらgit commitしてみよう

• git commit -a -m <コミットメッセージ>

• コミットメッセージは適当でいい

• でもそのメッセージを見ればどんな変更かわかるように!!!

GitHubにpushしてみよう

• git push origin master 

• これでGitHubに変更が適用されたはず

• ブラウザでリポジトリを見てみよう

Webサーバーを作ってみよう

• アクセスカウンタを実装してみよう

• アクセスがある度にカウンタを+1して表示する

Webサーバーを作ってみよう

• アクセスカウンタを実装してみよう

• アクセスごとにfork()しているので変数だと共有されない

• ファイルを使って記録するなどしないといけない

Webサーバーを作ってみよう

• アクセスカウンタを実装してみよう

• paramsにreset=trueと入っていたらカウンタをリセットするように変えてみよう

• strstr()などが使えるかも

• 完成したらcommit

Webサーバーを作ってみよう

• アクセスカウンタを実装してみよう

• paramsにreset=%dと入っていたらカウンタを与えられた数値にリセットするように変えてみよう

• util.cのparse_params()を使ってみよう

• 完成したらcommit

Webサーバーを作ってみよう

• ログインシステムを実装してみよう

• Cookieにadmin: trueと入っていたら別の文字列を表示するように実装してみよう

• util.cのparse_cookies()を使ってみよう

• 完成したらcommit

Webサーバーを作ってみよう

• ログインシステムを実装してみよう

• POSTアクセスでユーザー名とパスワードを送るように実装してみよう

• まずformタグをGETリクエストで表示する

Webサーバーを作ってみよう

<form method=‘POST’><input type=‘text’ name=‘user’ /><input type=‘password’ name=‘pass’ /><input type=‘submit’ value=’login’ />

</form>

Webサーバーを作ってみよう

• ログインシステムを実装してみよう

• 次にpost()の中で送られたデータを受け取ってみよう

• postの中でscanfなどで1行読み取ってparse_params()に投げればよい

Webサーバーを作ってみよう

• ログインシステムを実装してみよう

• 送られてきたユーザー名とパスワードが一致すればSet-Cookieヘッダーでadmin: trueを設定する

• その後に302でGETメソッドに転送する

• 完成したらcommit

Webサーバーを作ってみよう

• ログイン認証は難しかったかも

• とりあえずHTTPの仕組みやプロトコルの概念をわかってもらえればよい

• ”””C言語の文字列処理は闇”””

さいごに

• サーバーを壊してみよう

• sudo rm -rf --no-preserve-root / 

• 貴重な体験!!!

• どういう状況になるのか体感

さいごに

• サーバーを壊してみよう

• -bash: /bin/ls: No such file or directory 

• SSH接続を切ったが最後二度とつながることはない