サーバ構築の勘所が多分わかるハンズオン

 サーバ構築の勘所が多分わかるハンズオン

6d64a4d4ab6201f2ce57e3befc687785?s=128

Yoshiki Kobayashi

September 05, 2020
Tweet

Transcript

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

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

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

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

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

  6. さてさて今日は… 6

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

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

  9. • 基本的には手順通りに進められればOKだと思ってる。 • でもエラー出たら教えてくれ。僕も頑張って解決する。 • Windowsの人、手元にまともな検証機がなくてほんとごめん。 • 詰まったらできるだけエラー読んでみよう! • もちろん周りの人とか僕に聞いても良いです。

    • 聞くだけ〜じゃなくて、手を動かしてみると楽しいぞー • プレゼンでもなんでもないので、 わかんないところは都度聞いて平気だからね! 諸注意 9
  10. 1) 本日作る環境 & アプリケーション説明 2) サーバの概念 利用するVagrantfileについて 3) (なんとなく使うと)とっても危険なrootユーザ 4)

    必要パッケージのインストール 5) Systemdってなんだ 6) 必要パッケージのインストール② 7) SSHポートフォワーディングとは 8) アプリケーションのデプロイ 9) パーミッションとオーナー 10) トラブルシューティング 11) 最後に アジェンダ 10
  11. 本日 作る環境 & アプリケーション説明 1 11

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

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

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

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

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

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

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

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

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

  21. サーバ is 何 21

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

    サーバとは 22
  23. いやわからんな 23

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

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

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

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

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

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

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

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

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

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

  34. スーパーユーザー(英語: Superuser)とは、多くのオペレーティングシ ステムでシステムアドミニストレータが制御する特殊なユーザーアカウン トを指す。オペレーティングシステム (OS) によって実際の呼称は異な り、ルート (root)、アドミニストレータ (administrator)、アドミン (admin)、スーパーバイザ

    (supervisor) などとも呼ばれる。場合によっ ては名称は重要ではなく、ユーザーのプロファイルで権限フラグを設定 することで特権的機能を実行できることもある(管理者権限などと呼ば れる)。 by wikipedia rootユーザとは 34
  35. いや、また難しい説明しおって 35

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

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

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

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

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

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

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

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

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

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

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

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

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

  49. 38行目にある PermitRootLogin yes ↓ PermitRootLogin no 変更したあと、 を実行 (Vagrantで実行)rootログイン禁止してみよう #

    vi /etc/ssh/sshd_config # systemctl restart sshd 49
  50. 確認手順 一度Vagrantからログアウトする ローカルのマシンからさっきと同じコマンドでログインを試す これでログインできなくなってたらOK! rootユーザでログインすることを禁止できた! # exit $ ssh root@192.168.200.150

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

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

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

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

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

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

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

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

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

    → apt Mac → HomeBrew Windows → chocolatey(ちょこれーてい、まだβらしい) 59
  60. 今何をしたか② yum コマンドを使って、Apache, PHPをインストール yumのリポジトリに存在している場合、 それぞれ一番新しいパッケージをインストールできます $ sudo yum -y

    install httpd php 60
  61. それぞれのバージョンをみてみよう 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
  62. ご覧の通り 公式リポジトリから展開されているパッケージ、 割とバージョンが古いんですよね 62

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

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

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

    php-mysqlnd 65
  66. Systemdって なんだ 5 66

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

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

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

  70. はて Systemctl とは 70

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

  72. Systemdとは Linux上で動作するプロセスの 起動状態を管理するシステム。 CentOSだとSystemdっていう 仕組みが採用されている。 SysVinit → Upstart → systemdと

    時代の流れともに変わってきた (覚えなくて良い) 72
  73. Systemdを使うと何ができるか 一番のメリットは Systemd経由でプロセスの 起動管理をすることができる 73

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

  75. こんな感じになる インド人 中国人 日系の血が混じってるフ ランス人 この人たちを起こさ ないと (起きてるけど) 起来啊 कृ

    पया उ ठए Veuillez vous réveiller 75
  76. Systemdを使うと systemdさんがそれぞれの人を起こしてくれる つまり、こっちからはsystemdさんに 指示すればよい 76

  77. こんな感じになる インド人 中国人 日系の血が混じってるフ ランス人 中国の人起こして! インドの人 起こして! フランスの人 起こして!

    起来啊 कृ पया उ ठए Veuillez vous réveiller 77
  78. これをサーバに置き換えると 78

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

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

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

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

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

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

    sudo reboot $ ps auxww | grep httpd 84
  85. apacheのプロセスが立ち上がってませんか? 85

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

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

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

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

  90. いざ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
  91. なぜMySQL一つインストールするのにこんなことし なきゃいけないのか 登場人物としては4人 ①mysql-community-common → まあ共通ライブラリだろきっと ②mysql-community-libs → これも共通ライブラリ ③mysql-community-client

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

    インストールには①③が必要 92
  93. 依存ライブラリの存在 この辺りがサーバ構築の難易度を 上げている気がする… 93

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

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

    $ /vagrant/mysqlinit.sh 95
  96. SSHポート フォワーディング とは 7 96

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

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

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

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

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

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

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

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

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

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

  107. ポートフォワードのイメージ ローカルマシン (MacなりWindowsなり) Vagrantfileより起動した 仮想マシン イメージつきやすいように仮想マシンを別の場所に置いてるけどホントはローカルの一部 SSHトンネル SSH接続した時に 土管ができるイメージ IP:192.168.200.150

    http://localhost:3000/ で Railsに接続や Railsの人 ローカルマシン(の3000ポート)への通信をVagrant側に通信を転送するの が、SSHトンネルの役目。 つまり、左の人が http://localhost:3000/ にアクセスすると、 Vagrant内の3000ポートに通信が転送されるように設定されていた 107
  108. これを別の環境に置き換えて見ると こんなこともできます 108

  109. ポートフォワードの応用 ローカルマシン (MacなりWindowsなり) AWSとかその辺のサーバ 転送先はSSHでさえ繋がってしまえばVagrantでなくても応用可能なのです SSHトンネル SSH接続した時に 土管ができるイメージ IP:123.123.123.123 http://localhost:3000/

    で Railsに接続や Railsの人 外のサーバにSSH転送をしてあげることで、 localhost:3000で外の環境に接続することもできる!!!(SSHが繋がってれば) ぶっちゃけあんま使わないけど 109
  110. ポートフォワードのやり方 WindowsとMacで異なります‍♂ (異なるというか、設定の仕方が違うというか…) が、今回は一律SSHコマンドで 設定してみましょう 110

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

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

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

  114. SSHコマンドで何をしていたか 一個一個分解して考える $ ssh -L 8080:localhost:80 vagrant@192.168.200.150 -L ポート転送(SSHトンネル)を設定するオプション 8080

    転送元のポートを設定 localhost 転送元の情報 80 転送先のポート vagrant@~~~~ 転送先の情報兼ssh接続先 114
  115. つまり…? こういうこと $ ssh -L 8080:localhost:80 vagrant@192.168.200.150 localhost の 80ポート(http)

    への通信を vagrant内 の 8080ポート へ転送する 設定を入れた状態で SSH接続するよ!!!!!!! (いやカラフルで逆にわかりづらいな) 115
  116. ここらでちょっと考えてみよう ユースケースから落とし込んでみる ①ローカルの3000ポートを192.168.0.1の3000ポートに転送したい ②ローカルの1500ポートを200.200.200.200の2000ポートに転送したい ③1.1.1.1の13306へのアクセスを123.123.123.123のMySQLに転送したい 116

  117. ① $ ssh -L : : @192.168.0.1 ② $ ssh

    -L 1500:localhost:2000 vagrant@200.200.200.200 ③ $ ssh -L 13306:1.1.1.1:3306 vagrant@123.123.123.123 それぞれのコマンドを埋めてみよう ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ①’ ②’ ③’ ④’ ⑤’ 117
  118. 正解はこんな感じ 正解は 118

  119. ① $ ssh -L 3000:localhost:3000 vagrant@192.168.0.1 ② $ ssh -L

    1500:localhost:2000 vagrant@200.200.200.200 ③ $ ssh -L 13306:1.1.1.1:3306 vagrant@123.123.123.123 それぞれのコマンドを埋めてみよう 119
  120. ここまでできたらみなさん SSHポートフォワード免許皆伝です ここまでできたら 120

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

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

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

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

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

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

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

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

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

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

  131. ① cp test.txt hoge.txt ② cp test.txt hoge/fuga.txt ③ cp

    ~/test.txt ~/hoge/./ Q.このコマンドの実行結果を答えよ 131
  132. ① ディレクトリ内のtest.txt を hoge.txt って名前でコピー ② ディレクトリ内のtest.txt を hogeディレクトリ内、fuga.txtって名前でコピー ③

    ホームディレクトリ内のtest.txt を ホームディレクトリ内の hogeディレクトリ内に test.txt って名前でコピー A. 正解は 132
  133. 今日は時間の都合上割愛 今後めちゃくちゃ出てくるので、 頭の中でイメージできるようにしておくと良い! 相対パス、絶対パスのお話 133

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

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

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

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

    vagrant@192.168.200.150:/var/www/html/ 137
  138. $ scp -r ~/Desktop/linux-handson/src/* vagrant@192.168.200.150:/var/www/html/ まずこの部分からみていく 138

  139. コピー元のディレクトリ 各々 git clone したディレクトリを指定する この例だと、デスクトップ直下に git clone を 実行しているので、

    ~/Desktop/linux-handson/src/* って感じになる。 もちろん、デスクトップ直下にcloneしていない場合は 適宜読み替えてください! 139
  140. *(アスタリスク)について ワイルドカードといいます‍♂ これ使うと、 ファイル一つ一つを 指定しなくても済むので楽 140

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

    |--CreateHtml.php | |--DBSettingConstructor.php | |--PDOWrapper.php | |--create.php | |--delete.php | |--index.php 141
  142. アスタリスクを使わないと $ 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
  143. アスタリスクを使うと $ scp -r ~/Desktop/linux-handson/src/* ${コピー先} 楽!!!!!!! 143

  144. $ scp -r ~/Desktop/linux-handson/src/ vagrant@192.168.200.150:/var/www/html/ 次にこの部分 144

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

    vagrant@192.168.200.150:${コピー先ファイル} 認証をしています 145
  146. SSHで接続する時と同様の書き方になります 覚えやすくて良いね‍♂ そう、SCPの認証は 146

  147. $ scp -r ~/Desktop/linux-handson/src/ vagrant@192.168.200.150:/var/www/html/ 最後にこの部分 147

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

    148
  149. :/opt/data → ログイン後環境の /opt/data (絶対パス) :var/www → ログイン後環境の、 ログイン直後のホームディレクトリ以下の var/www

    (相対パス) これが分かりづらいんだよな いくつか例 149
  150. $ scp -r ~/Desktop/linux-handson/src/ vagrant@192.168.200.150:/var/www/html/ こうなる。 ポイントは、一つ一つを分けて考えること。 慣れるまで難しいかもだけど、慣れちゃえば簡単。 いや、ぶっちゃけRailsのform_for の引数覚える方が難しい気がするんだ…

    以上を加味すると組み立て終わったコマンドは 150
  151. それではソースコードを設置しよう! $ scp -r ~/Desktop/handson-linux/src/* vagrant@192.168.200.150:/var/www/html/ ローカルの環境から、 これを実行してください! ※winの人、 git

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

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

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

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

  156. 今回やろうとしたこと ローカルのファイルを vagrantユーザで 192.168.200.150のサーバ内の、 /var/www/html ってフォルダの中に、 コピー(書き込み)をしようとした $ scp -r

    ~/Desktop/handson-linux/src/* vagrant@192.168.200.150:/var/www/html/ 大きく関係あるところは色がついているところになります‍♂ 156
  157. パーミッションを確認してみよう Vagrantに一度ログインして、 書き込みしようとしていたフォルダの パーミッションを見てみよう $ ls -l /var/www こんな感じでいろいろ表示されましたか?? 157

  158. パーミッション(オーナー) is これ!!!!!!! ①ディレクトリとかファイルに 対してどんな権限(書き込み とか読み込みとか)があるか ②どのグ ループが 所有して いるか

    ③だれが 所有して いるか パーミッションの細かい説明はどこかの偉い人に任せるとして、 今回は手っ取り早くデプロイしたいので、 ②③のオーナーを変更しちゃいます! 158
  159. ディレクトリ[html]は rootグループが保有している → rootグループの人なら誰でも操作できる rootユーザが保有している → rootユーザなら操作できる 159

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

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

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

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

    vagrant:vagrant /var/www/html chown は ファイルとかディレクトリのオーナー、 オーナーグループを変更するコマンド 163
  164. 実行後 オーナーが変更になったか、 lsコマンドで確認してみますよ〜〜 $ ls -l /var/www こんな感じに変わってればオッケー 164

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

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

    8080:localhost:80 vagrant@192.168.200.150 166
  167. 何もページが表示されていない状態 になっていませんか? どうですか? 167

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

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

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

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

    (vimを使うのだ…) さて、トラシュー(トラブルシューティング)だ 171
  172. エラーがでていませんか? こんな感じで 172

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

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

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

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

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

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

  179. 最後に 11 179

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

  181. • サーバ、rootユーザの概念、rootユーザの権限 • Systemdの概念、簡単な使い方 • パッケージマネージャの概念、簡単な使い方 • ミドルウェアのインストール • ssh、scpコマンドの使い方

    • パーミッションの概念、解消方法 • エラーの読み方、慣れ方 • LAMP環境の構築 • 初学者がLinuxサーバ構築のとっかかりとなるちょっとした勘所 皆さんの今後の知識に繋がれば、とても嬉しいです。 本日勉強したこと 181
  182. 割と冗談抜きで 何回もぶっ壊そう!!!!!!! ローカル環境なんか、ぶっ壊したらまた作れば良いのと、 そのためのVagrantです。Scrap & Build で覚えるので、 臆せず、ぶっ壊しまくろう。 絶対に本番環境とかみんなが使ってる物ではやらないでね!!!!!!! さらに上達する、理解するためのテクニック

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

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

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

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