Slide 1

Slide 1 text

サーバ構築の勘所が 多分わかるハンズオン 2020/09/05 Yoshiki Kobayashi 1

Slide 2

Slide 2 text

Hello World! 自称なんでも屋。 好きな言語はJavaScriptとRuby。 最近はもっぱらJava書いてます。 NintendoSwitch諦めました。 買えた!!!!!!!!!! Name : Yoshiki Kobayashi @yoshi0202 https://code-plum.dev @codeplumdev 2

Slide 3

Slide 3 text

過去のハンズオンとか話した時の資料 大体この辺にあります https://speakerdeck.com/yoshi0202 こんな感じに定期的にゆるーくやってる感じです 3

Slide 4

Slide 4 text

堀越リーダー 本日はお誘いありがとうございます 4

Slide 5

Slide 5 text

僕は 偉くも凄くもない、 唯のお酒が好きな アラサーエンジニアなので 全く気遣いは不要です! ハンズオンに入る前に… 5

Slide 6

Slide 6 text

さてさて今日は… 6

Slide 7

Slide 7 text

事前にとったアンケートの結果、 サーバ構築ハンズオンをやっていこうと 思います アンケートご協力頂き感謝 7

Slide 8

Slide 8 text

今日このハンズオンをやってみることで サーバ構築の勘所が 少しだけわかるようになる! っていうのをゴールに設定します 本日のゴール 8

Slide 9

Slide 9 text

● 基本的には手順通りに進められればOKだと思ってる。 ● でもエラー出たら教えてくれ。僕も頑張って解決する。 ● Windowsの人、手元にまともな検証機がなくてほんとごめん。 ● 詰まったらできるだけエラー読んでみよう! ● もちろん周りの人とか僕に聞いても良いです。 ● 聞くだけ〜じゃなくて、手を動かしてみると楽しいぞー ● プレゼンでもなんでもないので、 わかんないところは都度聞いて平気だからね! 諸注意 9

Slide 10

Slide 10 text

1) 本日作る環境 & アプリケーション説明 2) サーバの概念 利用するVagrantfileについて 3) (なんとなく使うと)とっても危険なrootユーザ 4) 必要パッケージのインストール 5) Systemdってなんだ 6) 必要パッケージのインストール② 7) SSHポートフォワーディングとは 8) アプリケーションのデプロイ 9) パーミッションとオーナー 10) トラブルシューティング 11) 最後に アジェンダ 10

Slide 11

Slide 11 text

本日 作る環境 & アプリケーション説明 1 11

Slide 12

Slide 12 text

今日はLAMP環境を作ります 12

Slide 13

Slide 13 text

L inux A pache M ySql P HP 頭文字とってLAMP 13

Slide 14

Slide 14 text

(皆さんのこころの声) 14

Slide 15

Slide 15 text

Apacheとかwww 時代はNginxでしょwww PHPとかwww スクールでは Rubyやってましたよww 15

Slide 16

Slide 16 text

LAMPとて侮るなかれ。 全ての基本になっています。 …多分。 16

Slide 17

Slide 17 text

と、いうことで…本日の完成形はこちら! 休日2時間ぐらいで作ったので セキュリティもインジェクションもガバガバなアプリで ほんとごめん 17

Slide 18

Slide 18 text

本日のメインは ‍♂ プログラミング ‍♂ サーバ構築 ソースコードの完成形は 別途ダウンロードします 18

Slide 19

Slide 19 text

サーバの概念 利用する Vagrantfileについて 2 19

Slide 20

Slide 20 text

と、その前に… それでは早速サーバ構築していきますよ 20

Slide 21

Slide 21 text

サーバ is 何 21

Slide 22

Slide 22 text

サーバまたはサーバー(英: server)は、サービスを提供するソフトウェ ア、あるいはその機能が稼働しているコンピュータのことである。コン ピュータ分野のクライアントサーバモデルでは、クライアントからの要求 に対して情報や処理結果を提供する機能を果たす側を指す。本稿では この意味で記載する。サーバにはファイルサーバ、メールサーバ、Web サーバなど多数の用途や種類がある。更にサーバ用のコンピュータ機 器(ハードウェア)などもサーバと呼ぶ場合がある。 by Wikipedia サーバとは 22

Slide 23

Slide 23 text

いやわからんな 23

Slide 24

Slide 24 text

でっかいパソコン! ‍とっても高性能! アプリケーション動かしたり、 データ保存したりできる! ‍♂どっかよくわかんないけど 違うとこに物理的に存在してる! めちゃくちゃ簡単にいうと 24

Slide 25

Slide 25 text

AWS(EC2)とか使っても良かったんだけど、 クレジットカード事情とかもありそうなので、 Vagrantでやります! 今回のハンズオンは 25

Slide 26

Slide 26 text

突然のVagrantfile https://github.com/yoshi0202/linux-handson 各自デスクトップにhandsonっていうディレクトリを作って、 その中にダウンロードしたファイルを設置してください! 注意:既に仮想環境とか立ち上げてる人は一旦落としてね。 と言うことで 26

Slide 27

Slide 27 text

git からVagrantfileをcloneしてきて、vagrant upを実行するよ! 起動されたサーバの情報 IPアドレス:192.168.200.150 ログイン情報:root/password 早速vagrant up を実行! 27

Slide 28

Slide 28 text

vagrant ssh を使いません‍♂ 禁止‍♂ ちなみに今日は 28

Slide 29

Slide 29 text

Mac: なんか適当なターミナルソフト(iTermとか) Windows: なんか適当なターミナルソフト(TeraTermとか) でログインしましょう! コマンドはこんな感じ。 vagrant up でサーバが起動したら $ ssh [email protected] 29

Slide 30

Slide 30 text

yes と入力してEnterを入力! その後にパスワード password を入力! こんな画面がでたら 30

Slide 31

Slide 31 text

rootユーザでログインできましたか? [root@handson-linux ~]# ログインした後のターミナルが こんな感じになってればOK 31

Slide 32

Slide 32 text

(なんとなく使うと) とっても危険な rootユーザ 3 32

Slide 33

Slide 33 text

rootユーザで作業!する前に… rootってなんだ 33

Slide 34

Slide 34 text

スーパーユーザー(英語: Superuser)とは、多くのオペレーティングシ ステムでシステムアドミニストレータが制御する特殊なユーザーアカウン トを指す。オペレーティングシステム (OS) によって実際の呼称は異な り、ルート (root)、アドミニストレータ (administrator)、アドミン (admin)、スーパーバイザ (supervisor) などとも呼ばれる。場合によっ ては名称は重要ではなく、ユーザーのプロファイルで権限フラグを設定 することで特権的機能を実行できることもある(管理者権限などと呼ば れる)。 by wikipedia rootユーザとは 34

Slide 35

Slide 35 text

いや、また難しい説明しおって 35

Slide 36

Slide 36 text

root ユーザ = なんでもできるユーザー! UNIX系OS(今回だとCentOS)には、 デフォルトで組み込まれているユーザ。 めっちゃ簡単にいうと 36

Slide 37

Slide 37 text

本当になんでもできる。 データ削除、サーバのシャットダウン、 再起動、とかとか。 めっちゃ危険、めっちゃ危ない。 なんでも、ってどこまでできるの? 37

Slide 38

Slide 38 text

どれぐらい危険なのか、 実際のシチュエーションをみてみる (××太郎さんリスペクト) とある例 38

Slide 39

Slide 39 text

(どこかのとある作業者さん) 作業者「本番稼働してるサーバのディスク容量の削減をするで!」 作業者「権限的に楽だからrootユーザで作業するやで!」 作業者「大体このあたりのゴミファイル消すで!」 作業者「(カチャカチャカチャ、ッターーーン)」 作業者「アカン!間違えて世界を滅ぼしてしもうた!」 ※全データ消えるのでバルスコマンドと呼ばれてます。 じゃあ実際の本番可動してる物で考える [root@handson-linux ~] # rm -rf / 39

Slide 40

Slide 40 text

大障害、大損失。 損失とか、障害だけですめば良いが、 ユーザが利用しているサービスが止まる、 ということは 社会からの信用を失う事になる。 root ユーザを簡単に考えてしまうと… 40

Slide 41

Slide 41 text

みんながなんとなく root ユーザで 作業してしまったことによって 会社全体として大変なことに なってしまう可能性がある。 ※rm -rf / はrootユーザじゃなくても 実行できるのでマジで注意。約束。 41

Slide 42

Slide 42 text

rootでの作業は悪では無い。 そのためにいろんな仕組みがある。 コマンドを制限したsudo だったり、 とにかくいろいろ。 じゃあrootユーザで作業するのは悪なの? 42

Slide 43

Slide 43 text

気をつけよう!ってことが言いたかった! まぁ、人間気を付けるじゃ どうしようもないこともあるんだけどね… (苦い記憶がフラッシュバックする) とにかく作業するときには 43

Slide 44

Slide 44 text

僕が経験した過去最大の「やらかし」は お客さん保有ドメインのNSレコードの 書き換えです あのヒヤっと感は二度と 味わえないし味わいたくない… ちなみに 44

Slide 45

Slide 45 text

あれ? 今ってそんな危険な rootユーザでログインしてるんだよな? そんな危険なrootユーザ 45

Slide 46

Slide 46 text

rootユーザでログインできちゃうの、 そもそも危なくね??? っていうか 46

Slide 47

Slide 47 text

ということで rootユーザのログインを 禁止してみよう!!! 47

Slide 48

Slide 48 text

ここからコマンドを打つ時、 これでやっていきます! ここからはサーバ(Vagrant)にログインして実行 # シャープから始まるコマンドは root ユーザでのコマンド $ ダラーから始まるコマンドはvagrantユーザでのコマンド 48

Slide 49

Slide 49 text

38行目にある PermitRootLogin yes ↓ PermitRootLogin no 変更したあと、 を実行 (Vagrantで実行)rootログイン禁止してみよう # vi /etc/ssh/sshd_config # systemctl restart sshd 49

Slide 50

Slide 50 text

確認手順 一度Vagrantからログアウトする ローカルのマシンからさっきと同じコマンドでログインを試す これでログインできなくなってたらOK! rootユーザでログインすることを禁止できた! # exit $ ssh [email protected] 50

Slide 51

Slide 51 text

rootユーザで作業が必要なとき 今後はrootユーザで作業が必要なとき(root権限が必要な時)は sudo コマンドを使っていきます なので基本的には作業ユーザはvagrantです。 51

Slide 52

Slide 52 text

sudo コマンドとは なんとなくみんな使ってるsudoコマンド。 めっちゃ簡単にいうと、 root権限でコマンドが実行したい時に使う なんとなくで使うと危険なので注意! 52

Slide 53

Slide 53 text

では早速 現在rootユーザではログインできないはずなので、 vagrant 再度ログインしなおします! コマンドはこんな感じ パスワード:password $ ssh [email protected] 53

Slide 54

Slide 54 text

我が家の在宅作業環境 小休止① 54

Slide 55

Slide 55 text

必要パッケージの インストール 4 55

Slide 56

Slide 56 text

ゴリゴリサーバ構築していきますよーーー まずはパッケージをインストール! $ sudo yum -y update $ sudo yum -y install httpd php 56

Slide 57

Slide 57 text

今何をしたか OSにインストールされているパッケージの アップデートがあるか探して、 あればアップデートするコマンド。 yum っていうのが、今回のCentOSで利用している パッケージマネージャ となります。 $ sudo yum -y update 57

Slide 58

Slide 58 text

パッケージマネージャについて 有名なLinuxには、パッケージマネージャと言われる物が存在 どんなものか簡単にいうと、 パッケージを手動で一つインストールすることもできるけど、 このコマンドを介してインストールすることでアップデートなりアンインス トールを簡単にするための仕組み。 58

Slide 59

Slide 59 text

パッケージマネージャ、どんなのがあるの? 利用するOSによって違う物を使ってます R (Vagrant(Ubuntu)にHomebrewをインストールしようとする人が 多いこと多いこと…) RHEL系/CentOS/Amazon Linux系 → yum Debian系/Ubuntu系 → apt Mac → HomeBrew Windows → chocolatey(ちょこれーてい、まだβらしい) 59

Slide 60

Slide 60 text

今何をしたか② yum コマンドを使って、Apache, PHPをインストール yumのリポジトリに存在している場合、 それぞれ一番新しいパッケージをインストールできます $ sudo yum -y install httpd php 60

Slide 61

Slide 61 text

それぞれのバージョンをみてみよう Server version: Apache/2.4.6 (CentOS) (最新:2.4.46) PHP 5.4.16 (cli) (built: Apr 1 2020 04:07:17) (最新:7.4.6) $ httpd -v $ php -v 61

Slide 62

Slide 62 text

ご覧の通り 公式リポジトリから展開されているパッケージ、 割とバージョンが古いんですよね 62

Slide 63

Slide 63 text

使ってるバージョンを調整するには ①パッケージマネージャを利用して ②最新版のミドルウェア(さっきインストールしたapacheとか)が 使いたい! = 結構難易度が高くなる (まあできなくは無いけども。) 63

Slide 64

Slide 64 text

とりあえず パッケージマネージャ使うと 「簡単にインストールできるし管理も楽」 だけど、 「特定のバージョンをインストールすること」 が結構しんどい ってことを覚えてもらえれば良いかと ※今回は時間の都合上このバージョンでいきます。 64

Slide 65

Slide 65 text

PHPからPDO経由でMySQLに接続するために必要なので インストールを。 最終的にデプロイするアプリのために必要です! あとこれも $ sudo yum -y install php-pdo php-mysqlnd 65

Slide 66

Slide 66 text

Systemdって なんだ 5 66

Slide 67

Slide 67 text

さてさてそれでは ここからいっぱい単語がでてきますので覚悟‍♀ 67

Slide 68

Slide 68 text

まず、何も考えずに以下のコマンドを実行 そしたら $ sudo reboot で、一度サーバを再起動!起動したらもう一度ログインして $ ps auxww | grep httpd $ sudo systemctl disable httpd $ sudo reboot $ ps auxww | grep httpd 68

Slide 69

Slide 69 text

Apacheが起動…? していないはず。 なぜなら、 $ sudo systemctl disabled httpd というコマンドを実行しているから。 69

Slide 70

Slide 70 text

はて Systemctl とは 70

Slide 71

Slide 71 text

Systemctlとは めちゃくちゃ簡単にいうと、 Systemdを動かすためのコマンド 71

Slide 72

Slide 72 text

Systemdとは Linux上で動作するプロセスの 起動状態を管理するシステム。 CentOSだとSystemdっていう 仕組みが採用されている。 SysVinit → Upstart → systemdと 時代の流れともに変わってきた (覚えなくて良い) 72

Slide 73

Slide 73 text

Systemdを使うと何ができるか 一番のメリットは Systemd経由でプロセスの 起動管理をすることができる 73

Slide 74

Slide 74 text

Systemdを使わないとどうなるか? (例)母国の違う人たちを起こす時、 それぞれの言語で起こさないといけない 74

Slide 75

Slide 75 text

こんな感じになる インド人 中国人 日系の血が混じってるフ ランス人 この人たちを起こさ ないと (起きてるけど) 起来啊 कृ पया उ ठए Veuillez vous réveiller 75

Slide 76

Slide 76 text

Systemdを使うと systemdさんがそれぞれの人を起こしてくれる つまり、こっちからはsystemdさんに 指示すればよい 76

Slide 77

Slide 77 text

こんな感じになる インド人 中国人 日系の血が混じってるフ ランス人 中国の人起こして! インドの人 起こして! フランスの人 起こして! 起来啊 कृ पया उ ठए Veuillez vous réveiller 77

Slide 78

Slide 78 text

これをサーバに置き換えると 78

Slide 79

Slide 79 text

こんな感じになる MySQL apache Redis systemctl httpd start systemctl mysql start systemctl redis-server start httpd -k start mysql.server start redis-server 79

Slide 80

Slide 80 text

systemdを使うと 起動時の処理をラップ(wrap)してくれるので、 ミドルウェア別に定義されたコマンドを 入力しなくて良いので、とても便利 80

Slide 81

Slide 81 text

他にも いろんなメリットがあります ・起動状態をモニタリングできる ・起動ログを一つの場所に吐ける ・自動起動の処理につなげられる 複数あるので今回は割愛 81

Slide 82

Slide 82 text

結論何が言いたいかというと Systemdを使うと、 Linuxのプロセス起動状態が管理できて、 かつLinux起動時に「どれを起動するか」 が選べる 82

Slide 83

Slide 83 text

さっきのコマンド これは、httpdプロセス(apache)を Linux起動時に自動的に起動させなくするコマンド systemdを使うと、サーバ起動時に 「何を自動的に起動させるか」 みたいなのも細かく設定できる $ sudo systemctl disabled httpd 83

Slide 84

Slide 84 text

いろいろわかってきたところで 次はこれ! の後に、 で、一度再起動して、またログインした後に、 $ sudo systemctl enable httpd $ sudo reboot $ ps auxww | grep httpd 84

Slide 85

Slide 85 text

apacheのプロセスが立ち上がってませんか? 85

Slide 86

Slide 86 text

サーバが立ち上がった時に、 apacheを自動起動するよう 設定することができた 86

Slide 87

Slide 87 text

ターミナルソフト何使ってますか?? 結構使う頻度の高いソフトなので、こだわっても良いかも✨ 小休止② 87

Slide 88

Slide 88 text

必要パッケージの インストール② 6 88

Slide 89

Slide 89 text

次はMySQLをインストールしてみよう MySQLに関してはちょっと違うようにやってみる。 yumの標準リポジトリを使っても良いのだけど、 「お願いします!MySQL 5.7.30を使うことで 家族が救われるんです!!!」 という夢をみたので今回の要件としては 5.7.30をインストールすることにします。 89

Slide 90

Slide 90 text

いざMySQLインストール 上からコマンドを実行していくのだ $ sudo yum install -y https://downloads.mysql.com/archives/get/p/23/file/mysql-community-common-5.7.30-1.el7.x86_64.rpm $ sudo yum install -y https://downloads.mysql.com/archives/get/p/23/file/mysql-community-libs-5.7.30-1.el6.x86_64.rpm $ sudo yum install -y https://downloads.mysql.com/archives/get/p/23/file/mysql-community-client-5.7.30-1.el6.x86_64.rpm $ sudo yum install -y https://downloads.mysql.com/archives/get/p/23/file/mysql-community-server-5.7.30-1.el7.x86_64.rpm 90

Slide 91

Slide 91 text

なぜMySQL一つインストールするのにこんなことし なきゃいけないのか 登場人物としては4人 ①mysql-community-common → まあ共通ライブラリだろきっと ②mysql-community-libs → これも共通ライブラリ ③mysql-community-client → MySQLに接続するクライアント ④mysql-community-server → これ!これがインストールしたい 91

Slide 92

Slide 92 text

なぜMySQL一つインストールするのにこんなことし なきゃいけないのか それぞれのパッケージがそれぞれを依存している ①mysql-community-common 何もなくてもインストールできる ②mysql-community-libs 何もなくてもインストールできる ③mysql-community-client インストールには②が必要 ④mysql-community-server インストールには①③が必要 92

Slide 93

Slide 93 text

依存ライブラリの存在 この辺りがサーバ構築の難易度を 上げている気がする… 93

Slide 94

Slide 94 text

解決のコツ とにかくググる & 試す。 あとはちゃんとエラーを読んで 足りてないパッケージの情報を 読み取る。これだけ。 これが難しい。 94

Slide 95

Slide 95 text

MySQLのインストールは完了したので 設定を変更するスクリプトを流すよ! このスクリプトの中身までは今回は割愛 (パスワードの設定とかめんどくさかったので、僕が作ったお手製のスクリプトです) 一度mysqlを起動し、スクリプトを実行 $ sudo systemctl start mysqld $ /vagrant/mysqlinit.sh 95

Slide 96

Slide 96 text

SSHポート フォワーディング とは 7 96

Slide 97

Slide 97 text

apacheのハローページを出してみよう! まずは何も考えずにブラウザを表示し、 http://192.168.200.150 にアクセス! 97

Slide 98

Slide 98 text

こんな感じでハローページ出ましたかね? 98

Slide 99

Slide 99 text

今何をしているか SSHでアクセスしている時に 気がついた人は気がついたと思いますが、 実はこのVagrantには[192.168.200.150]というIPが 設定されています。 今はブラウザから、 VagrantのローカルIPを利用して 直接アクセスしている状態‍♂ 99

Slide 100

Slide 100 text

ん? 前からこんな方法でアクセスしてたっけ 以前は localhost:3000 とかでアクセスしていたような 100

Slide 101

Slide 101 text

ってかそもそもlocalhostってなんだ localhostとは、自分自身を差す。 127.0.0.1っていうIPアドレスも、自分自身を差す。 つまり、カリキュラムでやっていたこれは同様の意味。 http://localhost:3000/ http://127.0.0.1:3000/ http://192.168.200.150:3000/ ↑ イマコレ 101

Slide 102

Slide 102 text

localhostを利用して自分自身に アクセスしていたのに、 なぜvagrant上にアクセスできていたんだ 102

Slide 103

Slide 103 text

Vagrantとローカルマシンの位置関係 ローカルマシン (MacなりWindowsなり) Vagrantfileより起動した 仮想マシン IP:192.168.200.150 103

Slide 104

Slide 104 text

Vagrantとローカルマシンの位置関係 確かに自分自身ではあるけど、 住んでる世界は別世界。 ローカルマシンとVagrantは 別の場所に存在している 104

Slide 105

Slide 105 text

正解は… ポートフォワード という技術を利用していました さてここからまた難しくなるよー 105

Slide 106

Slide 106 text

ポートフォワードとは めちゃくちゃ簡単にいうと、 「特定の宛先の通信」を、 「任意の宛先の通信」に、 変換できる技術。 なにそれすごい。 106

Slide 107

Slide 107 text

ポートフォワードのイメージ ローカルマシン (MacなりWindowsなり) Vagrantfileより起動した 仮想マシン イメージつきやすいように仮想マシンを別の場所に置いてるけどホントはローカルの一部 SSHトンネル SSH接続した時に 土管ができるイメージ IP:192.168.200.150 http://localhost:3000/ で Railsに接続や Railsの人 ローカルマシン(の3000ポート)への通信をVagrant側に通信を転送するの が、SSHトンネルの役目。 つまり、左の人が http://localhost:3000/ にアクセスすると、 Vagrant内の3000ポートに通信が転送されるように設定されていた 107

Slide 108

Slide 108 text

これを別の環境に置き換えて見ると こんなこともできます 108

Slide 109

Slide 109 text

ポートフォワードの応用 ローカルマシン (MacなりWindowsなり) AWSとかその辺のサーバ 転送先はSSHでさえ繋がってしまえばVagrantでなくても応用可能なのです SSHトンネル SSH接続した時に 土管ができるイメージ IP:123.123.123.123 http://localhost:3000/ で Railsに接続や Railsの人 外のサーバにSSH転送をしてあげることで、 localhost:3000で外の環境に接続することもできる!!!(SSHが繋がってれば) ぶっちゃけあんま使わないけど 109

Slide 110

Slide 110 text

ポートフォワードのやり方 WindowsとMacで異なります‍♂ (異なるというか、設定の仕方が違うというか…) が、今回は一律SSHコマンドで 設定してみましょう 110

Slide 111

Slide 111 text

VagrantのApacheに localhost:8080で 接続する方法 Vagrantにターミナルで接続している人は一旦 xit でログアウト! その後に、このコマンドを入力して再度接続! $ exit $ ssh -L 8080:localhost:80 [email protected] 111

Slide 112

Slide 112 text

localhost:80 ではない理由 めちゃくちゃ簡単にいうといろいろめんどくさい & セキュリティソフトとかでブロックされてる可能性が高い ので、localのポートは8080を選びました。 (いろいろあるけどあんま気にしないで←) 112

Slide 113

Slide 113 text

接続後の確認 ローカルマシンでブラウザを立ち上げて、 http://localhost:8080/ に接続! apacheのページが見えたでしょうか?? 113

Slide 114

Slide 114 text

SSHコマンドで何をしていたか 一個一個分解して考える $ ssh -L 8080:localhost:80 [email protected] -L ポート転送(SSHトンネル)を設定するオプション 8080 転送元のポートを設定 localhost 転送元の情報 80 転送先のポート vagrant@~~~~ 転送先の情報兼ssh接続先 114

Slide 115

Slide 115 text

つまり…? こういうこと $ ssh -L 8080:localhost:80 [email protected] localhost の 80ポート(http) への通信を vagrant内 の 8080ポート へ転送する 設定を入れた状態で SSH接続するよ!!!!!!! (いやカラフルで逆にわかりづらいな) 115

Slide 116

Slide 116 text

ここらでちょっと考えてみよう ユースケースから落とし込んでみる ①ローカルの3000ポートを192.168.0.1の3000ポートに転送したい ②ローカルの1500ポートを200.200.200.200の2000ポートに転送したい ③1.1.1.1の13306へのアクセスを123.123.123.123のMySQLに転送したい 116

Slide 117

Slide 117 text

① $ ssh -L : : @192.168.0.1 ② $ ssh -L 1500:localhost:2000 [email protected] ③ $ ssh -L 13306:1.1.1.1:3306 [email protected] それぞれのコマンドを埋めてみよう ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ①’ ②’ ③’ ④’ ⑤’ 117

Slide 118

Slide 118 text

正解はこんな感じ 正解は 118

Slide 119

Slide 119 text

① $ ssh -L 3000:localhost:3000 [email protected] ② $ ssh -L 1500:localhost:2000 [email protected] ③ $ ssh -L 13306:1.1.1.1:3306 [email protected] それぞれのコマンドを埋めてみよう 119

Slide 120

Slide 120 text

ここまでできたらみなさん SSHポートフォワード免許皆伝です ここまでできたら 120

Slide 121

Slide 121 text

カリキュラム進めてて、 こんな設定してたっけか いや、してないよな あれ?でも? 121

Slide 122

Slide 122 text

今まで、実はVagrantさんが この辺りの設定を代わりに してくれてました… 圧倒的感謝 実はVagrantさんが頑張ってくれてました 122

Slide 123

Slide 123 text

Vagrant環境のApacheにアクセスするときは、 さっきのSSH転送を使ってきましょう Vagrantさんの設定はちょっと割愛 ということで今日は 123

Slide 124

Slide 124 text

Switch買えた!!!!!!!!!!!!!!!!!!!! 勉強の時間削ってBotWばっかりやってる!!!!!!!! FFCCは青春のゲーム!!!!!!! 小休止③ 124

Slide 125

Slide 125 text

アプリケーションの デプロイ 8 125

Slide 126

Slide 126 text

サーバ構築が 徐々に進んできました さてさて 126

Slide 127

Slide 127 text

アプリケーションでも、 デプロイしてみますかね ちょっとここらで 127

Slide 128

Slide 128 text

今日はVagrant内ではgit clone 禁止 ‍♂ scp ってコマンド使って デプロイしますよ デプロイの時にgit clone は使うけど 128

Slide 129

Slide 129 text

SecureCoPy。 SSH形式で接続しながら、 ファイルのやりとりができる 超絶便利コマンド。 scp ってなんぞや 129

Slide 130

Slide 130 text

cp コマンドの使い方、 みなさん覚えてます?? 話は変わって 130

Slide 131

Slide 131 text

① cp test.txt hoge.txt ② cp test.txt hoge/fuga.txt ③ cp ~/test.txt ~/hoge/./ Q.このコマンドの実行結果を答えよ 131

Slide 132

Slide 132 text

① ディレクトリ内のtest.txt を hoge.txt って名前でコピー ② ディレクトリ内のtest.txt を hogeディレクトリ内、fuga.txtって名前でコピー ③ ホームディレクトリ内のtest.txt を ホームディレクトリ内の hogeディレクトリ内に test.txt って名前でコピー A. 正解は 132

Slide 133

Slide 133 text

今日は時間の都合上割愛 今後めちゃくちゃ出てくるので、 頭の中でイメージできるようにしておくと良い! 相対パス、絶対パスのお話 133

Slide 134

Slide 134 text

scpコマンドの使い方 基本形はこんな感じ $ scp ${コピー元のファイルパス} ${コピー先のファイルパス} では早速 134

Slide 135

Slide 135 text

scpコマンドの書式は基本的に cpコマンドと同様! 覚えやすいつくりですね そう、scpは 135

Slide 136

Slide 136 text

コピー元:ローカルにgit clone したソースコード コピー先:vagrant内の特定ディレクトリ これを実行したい 今回やりたいこと 136

Slide 137

Slide 137 text

scp コマンドを組み立てるとこんな感じになる ※ -r オプションは、ディレクトリを丸々コピーする時に必要 コマンドを組み立てる $ scp -r ~/Desktop/linux-handson/src/* [email protected]:/var/www/html/ 137

Slide 138

Slide 138 text

$ scp -r ~/Desktop/linux-handson/src/* [email protected]:/var/www/html/ まずこの部分からみていく 138

Slide 139

Slide 139 text

コピー元のディレクトリ 各々 git clone したディレクトリを指定する この例だと、デスクトップ直下に git clone を 実行しているので、 ~/Desktop/linux-handson/src/* って感じになる。 もちろん、デスクトップ直下にcloneしていない場合は 適宜読み替えてください! 139

Slide 140

Slide 140 text

*(アスタリスク)について ワイルドカードといいます‍♂ これ使うと、 ファイル一つ一つを 指定しなくても済むので楽 140

Slide 141

Slide 141 text

例えばこんな感じ ~Desktop/work/linux-handson |--README.md |--Vagrantfile |--mysqlinit.sh |--src ← ここの中身を全部転送したい、でも~~~~.phpっていうファイルを     すべて指定するのはめんどくさい… | |--CreateHtml.php | |--DBSettingConstructor.php | |--PDOWrapper.php | |--create.php | |--delete.php | |--index.php 141

Slide 142

Slide 142 text

アスタリスクを使わないと $ scp -r ~/Desktop/linux-handson/src/CreateHtml.php ${コピー先} $ scp -r ~/Desktop/linux-handson/src/DBSettingConstructor.php ${コピー先} $ scp -r ~/Desktop/linux-handson/src/PDOWrapper.php ${コピー先} $ scp -r ~/Desktop/linux-handson/src/create.php ${コピー先} $ scp -r ~/Desktop/linux-handson/src/delete.php ${コピー先} $ scp -r ~/Desktop/linux-handson/src/index.php ${コピー先} いや、めちゃくちゃめんどくさいな 142

Slide 143

Slide 143 text

アスタリスクを使うと $ scp -r ~/Desktop/linux-handson/src/* ${コピー先} 楽!!!!!!! 143

Slide 144

Slide 144 text

$ scp -r ~/Desktop/linux-handson/src/ [email protected]:/var/www/html/ 次にこの部分 144

Slide 145

Slide 145 text

勘の良い人なら気がつくと思いますが、 SCPはSSHの接続を元にデータ転送しています 今までいっぱい打ってきたSSHコマンド $ ssh [email protected] 今回打ってるSCPコマンド $ scp ${コピー元ファイル} [email protected]:${コピー先ファイル} 認証をしています 145

Slide 146

Slide 146 text

SSHで接続する時と同様の書き方になります 覚えやすくて良いね‍♂ そう、SCPの認証は 146

Slide 147

Slide 147 text

$ scp -r ~/Desktop/linux-handson/src/ [email protected]:/var/www/html/ 最後にこの部分 147

Slide 148

Slide 148 text

一番最後はコピー先のディレクトリを 指定してます :/var/www/html/ これは、ログイン後の環境で、 絶対パス /var/www/html/ 以下に、 コピー元のファイルをコピーする、 って意味です‍♂ コピー先のディレクトリ 148

Slide 149

Slide 149 text

:/opt/data → ログイン後環境の /opt/data (絶対パス) :var/www → ログイン後環境の、 ログイン直後のホームディレクトリ以下の var/www (相対パス) これが分かりづらいんだよな いくつか例 149

Slide 150

Slide 150 text

$ scp -r ~/Desktop/linux-handson/src/ [email protected]:/var/www/html/ こうなる。 ポイントは、一つ一つを分けて考えること。 慣れるまで難しいかもだけど、慣れちゃえば簡単。 いや、ぶっちゃけRailsのform_for の引数覚える方が難しい気がするんだ… 以上を加味すると組み立て終わったコマンドは 150

Slide 151

Slide 151 text

それではソースコードを設置しよう! $ scp -r ~/Desktop/handson-linux/src/* [email protected]:/var/www/html/ ローカルの環境から、 これを実行してください! ※winの人、 git bashとか使ってもらえるとありがたいかも… 151

Slide 152

Slide 152 text

無事に、エラーに、なりましたかね? 無事にエラーになっていたら成功です (わざとこういう構成にしてます) さてエラーを読んで行きますよ〜 152

Slide 153

Slide 153 text

パーミッションと オーナー 9 153

Slide 154

Slide 154 text

パーミッションエラー…だと? 154

Slide 155

Slide 155 text

パーミッションて何 めちゃくちゃ簡単にいうと、 誰が、 何を、 どこまで、 操作できるか、 って感じです。 155

Slide 156

Slide 156 text

今回やろうとしたこと ローカルのファイルを vagrantユーザで 192.168.200.150のサーバ内の、 /var/www/html ってフォルダの中に、 コピー(書き込み)をしようとした $ scp -r ~/Desktop/handson-linux/src/* [email protected]:/var/www/html/ 大きく関係あるところは色がついているところになります‍♂ 156

Slide 157

Slide 157 text

パーミッションを確認してみよう Vagrantに一度ログインして、 書き込みしようとしていたフォルダの パーミッションを見てみよう $ ls -l /var/www こんな感じでいろいろ表示されましたか?? 157

Slide 158

Slide 158 text

パーミッション(オーナー) is これ!!!!!!! ①ディレクトリとかファイルに 対してどんな権限(書き込み とか読み込みとか)があるか ②どのグ ループが 所有して いるか ③だれが 所有して いるか パーミッションの細かい説明はどこかの偉い人に任せるとして、 今回は手っ取り早くデプロイしたいので、 ②③のオーナーを変更しちゃいます! 158

Slide 159

Slide 159 text

ディレクトリ[html]は rootグループが保有している → rootグループの人なら誰でも操作できる rootユーザが保有している → rootユーザなら操作できる 159

Slide 160

Slide 160 text

そもそもLinuxには 「ユーザーグループ」が存在し、 グループに所属する形で 「ユーザ」が存在している 160

Slide 161

Slide 161 text

ちなみにたくさんユーザいます 161

Slide 162

Slide 162 text

/var/www/html のディレクトリは root グループに所属したユーザ or root ユーザでしか操作することができなかったのです 162

Slide 163

Slide 163 text

ってなわけで /var/www/html のディレクトリを vagrant ユーザでも操作できるように変更する vagrant にログイン後にこのコマンドを実行! $ sudo chown vagrant:vagrant /var/www/html chown は ファイルとかディレクトリのオーナー、 オーナーグループを変更するコマンド 163

Slide 164

Slide 164 text

実行後 オーナーが変更になったか、 lsコマンドで確認してみますよ〜〜 $ ls -l /var/www こんな感じに変わってればオッケー 164

Slide 165

Slide 165 text

ローカルの環境から、 もう一度実行してください! こんどはうまく、転送できましたかね? それではもう一度scpを実行してみよう! $ scp -r ~/Desktop/linux-handson/src/* [email protected]:/var/www/html/ 165

Slide 166

Slide 166 text

vagrant に ssh転送を設定するように設定し、ターミナルからログイン! こうなったらapacheにアクセスできるはずなので、 ローカルマシンからブラウザでアクセスしてみよう! http://localhost:8080/ では早速… $ ssh -L 8080:localhost:80 [email protected] 166

Slide 167

Slide 167 text

何もページが表示されていない状態 になっていませんか? どうですか? 167

Slide 168

Slide 168 text

PHPが正常に動作していない状態 つまり、エラー状態です。 そうこれは 168

Slide 169

Slide 169 text

Railsの赤いエラー画面、 「優しいなぁ」 って感じませんか?? あれ出るとムカつくけど こういうのみると 169

Slide 170

Slide 170 text

トラブル シューティング 10 170

Slide 171

Slide 171 text

Railsのエラー画面に優しみを感じたところで、 出ているであろうエラーをみてみよう エラーが出力されているログファイルはこちら↓ /var/log/httpd/error_log 自由なコマンドを使って見てください headでも、tailでも、lessでも、catでも、vi -R でも、viewでも可。 root権限必要なので、sudo を頭に付けないとダメだよ!!!!! (vimを使うのだ…) さて、トラシュー(トラブルシューティング)だ 171

Slide 172

Slide 172 text

エラーがでていませんか? こんな感じで 172

Slide 173

Slide 173 text

(PHP勢はちょっと自重) ローカルか何かでソースコード見て、 わかりそうな人いますか〜〜 エラーの中身、なんだか分かりそうな人 173

Slide 174

Slide 174 text

SyntaxError出てるし、なんかTypoっぽいな 誰だこんな明らかにデバッグ不足な クソコード書いたのは あれ、このソースコードもしかして… 174

Slide 175

Slide 175 text

① ターミナルで直接 vi で開いて修正 ②ローカルで修正してもう一回scpコマンドでサーバに転送 どっちでも大丈夫です ログファイルから修正箇所を探してみよう!! 言われた通りにソースコードを修正してみよう 175

Slide 176

Slide 176 text

修正箇所こちらです (wazato typo とかコメント残したの人生で初めてだ) わからない人へ 末尾に ; セミコロンが無い!!! → new DBSettingConstructor(); 176

Slide 177

Slide 177 text

修正が終わったら、 もう一度ローカルのブラウザから アプリにアクセスしてみてください! http://localhost:8080 それでは最後に… 177

Slide 178

Slide 178 text

ブラウザでアクセスすると アプリ動いているよね!!! 嬉しい!!!!!! やったーーーーーーーー 178

Slide 179

Slide 179 text

最後に 11 179

Slide 180

Slide 180 text

本日のハンズオンは以上となります 長い時間お付き合い頂き、 本当にありがとうございました さてさて 180

Slide 181

Slide 181 text

● サーバ、rootユーザの概念、rootユーザの権限 ● Systemdの概念、簡単な使い方 ● パッケージマネージャの概念、簡単な使い方 ● ミドルウェアのインストール ● ssh、scpコマンドの使い方 ● パーミッションの概念、解消方法 ● エラーの読み方、慣れ方 ● LAMP環境の構築 ● 初学者がLinuxサーバ構築のとっかかりとなるちょっとした勘所 皆さんの今後の知識に繋がれば、とても嬉しいです。 本日勉強したこと 181

Slide 182

Slide 182 text

割と冗談抜きで 何回もぶっ壊そう!!!!!!! ローカル環境なんか、ぶっ壊したらまた作れば良いのと、 そのためのVagrantです。Scrap & Build で覚えるので、 臆せず、ぶっ壊しまくろう。 絶対に本番環境とかみんなが使ってる物ではやらないでね!!!!!!! さらに上達する、理解するためのテクニック 182

Slide 183

Slide 183 text

これやってみるとどうなるんだろ? こう変えるとどうなるんだろ? やってみても良いのかな? 思考よりも先に実行だ。 もし不安なら相談してください ぶっ壊すのが怖い人 183

Slide 184

Slide 184 text

「こんな話聞きたい」とか 「こんなハンズオンだったら参加したい」 みたいなの、バッチバチにお待ちしてます!!! 30秒で終わるのでよかったら感想ください https://forms.gle/JMxtk5C2bydnMgJ99 最後にアンケートご協力お願いできればと 184

Slide 185

Slide 185 text

終わりっす!!!!!! 最後に好きな絵文字で締めます To be continued …? 締めの言葉 185

Slide 186

Slide 186 text

Thanks! 全体通した質問や不明点、 「ここもっと聞きたい!」とか 「こんな感じに進めたら良いかも!」みたいな、 感想から質問までなんでもあれば!!!! 186