Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サーバ構築の勘所が多分わかるハンズオン
Search
Yoshiki Kobayashi
September 05, 2020
Programming
0
340
サーバ構築の勘所が多分わかるハンズオン
Yoshiki Kobayashi
September 05, 2020
Tweet
Share
More Decks by Yoshiki Kobayashi
See All by Yoshiki Kobayashi
エンジニアとして生きていくために在学中に多分やっておいた方が良いこと
yoshi0202
1
400
ターミナル操作が多分早くなるtmuxのすゝめ
yoshi0202
0
510
サーバレスアーキテクチャでLINE BOTが多分作れるようになるハンズオン
yoshi0202
0
870
Dockerのことが多分わかるハンズオン
yoshi0202
38
16k
sessionとcookieが多分わかる資料
yoshi0202
11
12k
Other Decks in Programming
See All in Programming
第3回関東Kaggler会_AtCoderはKaggleの役に立つ
chettub
3
1.2k
コミュニティ駆動 AWS CDK ライブラリ「Open Constructs Library」 / community-cdk-library
gotok365
2
240
Learning Kotlin with detekt
inouehi
1
120
Djangoアプリケーション 運用のリアル 〜問題発生から可視化、最適化への道〜 #pyconshizu
kashewnuts
1
260
Datadog Workflow Automation で圧倒的価値提供
showwin
1
160
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
190
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
250
Bedrock Agentsレスポンス解析によるAgentのOps
licux
3
920
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
push_gawa
1
550
pylint custom ruleで始めるレビュー自動化
shogoujiie
0
150
Datadog DBMでなにができる? JDDUG Meetup#7
nealle
0
140
Jasprが凄い話
hyshu
0
160
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
370
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Become a Pro
speakerdeck
PRO
26
5.2k
Building Your Own Lightsaber
phodgson
104
6.2k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
Transcript
サーバ構築の勘所が 多分わかるハンズオン 2020/09/05 Yoshiki Kobayashi 1
Hello World! 自称なんでも屋。 好きな言語はJavaScriptとRuby。 最近はもっぱらJava書いてます。 NintendoSwitch諦めました。 買えた!!!!!!!!!! Name : Yoshiki
Kobayashi @yoshi0202 https://code-plum.dev @codeplumdev 2
過去のハンズオンとか話した時の資料 大体この辺にあります https://speakerdeck.com/yoshi0202 こんな感じに定期的にゆるーくやってる感じです 3
堀越リーダー 本日はお誘いありがとうございます 4
僕は 偉くも凄くもない、 唯のお酒が好きな アラサーエンジニアなので 全く気遣いは不要です! ハンズオンに入る前に… 5
さてさて今日は… 6
事前にとったアンケートの結果、 サーバ構築ハンズオンをやっていこうと 思います アンケートご協力頂き感謝 7
今日このハンズオンをやってみることで サーバ構築の勘所が 少しだけわかるようになる! っていうのをゴールに設定します 本日のゴール 8
• 基本的には手順通りに進められればOKだと思ってる。 • でもエラー出たら教えてくれ。僕も頑張って解決する。 • Windowsの人、手元にまともな検証機がなくてほんとごめん。 • 詰まったらできるだけエラー読んでみよう! • もちろん周りの人とか僕に聞いても良いです。
• 聞くだけ〜じゃなくて、手を動かしてみると楽しいぞー • プレゼンでもなんでもないので、 わかんないところは都度聞いて平気だからね! 諸注意 9
1) 本日作る環境 & アプリケーション説明 2) サーバの概念 利用するVagrantfileについて 3) (なんとなく使うと)とっても危険なrootユーザ 4)
必要パッケージのインストール 5) Systemdってなんだ 6) 必要パッケージのインストール② 7) SSHポートフォワーディングとは 8) アプリケーションのデプロイ 9) パーミッションとオーナー 10) トラブルシューティング 11) 最後に アジェンダ 10
本日 作る環境 & アプリケーション説明 1 11
今日はLAMP環境を作ります 12
L inux A pache M ySql P HP 頭文字とってLAMP 13
(皆さんのこころの声) 14
Apacheとかwww 時代はNginxでしょwww PHPとかwww スクールでは Rubyやってましたよww 15
LAMPとて侮るなかれ。 全ての基本になっています。 …多分。 16
と、いうことで…本日の完成形はこちら! 休日2時間ぐらいで作ったので セキュリティもインジェクションもガバガバなアプリで ほんとごめん 17
本日のメインは ♂ プログラミング ♂ サーバ構築 ソースコードの完成形は 別途ダウンロードします 18
サーバの概念 利用する Vagrantfileについて 2 19
と、その前に… それでは早速サーバ構築していきますよ 20
サーバ is 何 21
サーバまたはサーバー(英: server)は、サービスを提供するソフトウェ ア、あるいはその機能が稼働しているコンピュータのことである。コン ピュータ分野のクライアントサーバモデルでは、クライアントからの要求 に対して情報や処理結果を提供する機能を果たす側を指す。本稿では この意味で記載する。サーバにはファイルサーバ、メールサーバ、Web サーバなど多数の用途や種類がある。更にサーバ用のコンピュータ機 器(ハードウェア)などもサーバと呼ぶ場合がある。 by Wikipedia
サーバとは 22
いやわからんな 23
でっかいパソコン! とっても高性能! アプリケーション動かしたり、 データ保存したりできる! ♂どっかよくわかんないけど 違うとこに物理的に存在してる! めちゃくちゃ簡単にいうと 24
AWS(EC2)とか使っても良かったんだけど、 クレジットカード事情とかもありそうなので、 Vagrantでやります! 今回のハンズオンは 25
突然のVagrantfile https://github.com/yoshi0202/linux-handson 各自デスクトップにhandsonっていうディレクトリを作って、 その中にダウンロードしたファイルを設置してください! 注意:既に仮想環境とか立ち上げてる人は一旦落としてね。 と言うことで 26
git からVagrantfileをcloneしてきて、vagrant upを実行するよ! 起動されたサーバの情報 IPアドレス:192.168.200.150 ログイン情報:root/password 早速vagrant up を実行! 27
vagrant ssh を使いません♂ 禁止♂ ちなみに今日は 28
Mac: なんか適当なターミナルソフト(iTermとか) Windows: なんか適当なターミナルソフト(TeraTermとか) でログインしましょう! コマンドはこんな感じ。 vagrant up でサーバが起動したら $
ssh root@192.168.200.150 29
yes と入力してEnterを入力! その後にパスワード password を入力! こんな画面がでたら 30
rootユーザでログインできましたか? [root@handson-linux ~]# ログインした後のターミナルが こんな感じになってればOK 31
(なんとなく使うと) とっても危険な rootユーザ 3 32
rootユーザで作業!する前に… rootってなんだ 33
スーパーユーザー(英語: Superuser)とは、多くのオペレーティングシ ステムでシステムアドミニストレータが制御する特殊なユーザーアカウン トを指す。オペレーティングシステム (OS) によって実際の呼称は異な り、ルート (root)、アドミニストレータ (administrator)、アドミン (admin)、スーパーバイザ
(supervisor) などとも呼ばれる。場合によっ ては名称は重要ではなく、ユーザーのプロファイルで権限フラグを設定 することで特権的機能を実行できることもある(管理者権限などと呼ば れる)。 by wikipedia rootユーザとは 34
いや、また難しい説明しおって 35
root ユーザ = なんでもできるユーザー! UNIX系OS(今回だとCentOS)には、 デフォルトで組み込まれているユーザ。 めっちゃ簡単にいうと 36
本当になんでもできる。 データ削除、サーバのシャットダウン、 再起動、とかとか。 めっちゃ危険、めっちゃ危ない。 なんでも、ってどこまでできるの? 37
どれぐらい危険なのか、 実際のシチュエーションをみてみる (××太郎さんリスペクト) とある例 38
(どこかのとある作業者さん) 作業者「本番稼働してるサーバのディスク容量の削減をするで!」 作業者「権限的に楽だからrootユーザで作業するやで!」 作業者「大体このあたりのゴミファイル消すで!」 作業者「(カチャカチャカチャ、ッターーーン)」 作業者「アカン!間違えて世界を滅ぼしてしもうた!」 ※全データ消えるのでバルスコマンドと呼ばれてます。 じゃあ実際の本番可動してる物で考える [root@handson-linux ~]
# rm -rf / 39
大障害、大損失。 損失とか、障害だけですめば良いが、 ユーザが利用しているサービスが止まる、 ということは 社会からの信用を失う事になる。 root ユーザを簡単に考えてしまうと… 40
みんながなんとなく root ユーザで 作業してしまったことによって 会社全体として大変なことに なってしまう可能性がある。 ※rm -rf / はrootユーザじゃなくても
実行できるのでマジで注意。約束。 41
rootでの作業は悪では無い。 そのためにいろんな仕組みがある。 コマンドを制限したsudo だったり、 とにかくいろいろ。 じゃあrootユーザで作業するのは悪なの? 42
気をつけよう!ってことが言いたかった! まぁ、人間気を付けるじゃ どうしようもないこともあるんだけどね… (苦い記憶がフラッシュバックする) とにかく作業するときには 43
僕が経験した過去最大の「やらかし」は お客さん保有ドメインのNSレコードの 書き換えです あのヒヤっと感は二度と 味わえないし味わいたくない… ちなみに 44
あれ? 今ってそんな危険な rootユーザでログインしてるんだよな? そんな危険なrootユーザ 45
rootユーザでログインできちゃうの、 そもそも危なくね??? っていうか 46
ということで rootユーザのログインを 禁止してみよう!!! 47
ここからコマンドを打つ時、 これでやっていきます! ここからはサーバ(Vagrant)にログインして実行 # シャープから始まるコマンドは root ユーザでのコマンド $ ダラーから始まるコマンドはvagrantユーザでのコマンド 48
38行目にある PermitRootLogin yes ↓ PermitRootLogin no 変更したあと、 を実行 (Vagrantで実行)rootログイン禁止してみよう #
vi /etc/ssh/sshd_config # systemctl restart sshd 49
確認手順 一度Vagrantからログアウトする ローカルのマシンからさっきと同じコマンドでログインを試す これでログインできなくなってたらOK! rootユーザでログインすることを禁止できた! # exit $ ssh root@192.168.200.150
50
rootユーザで作業が必要なとき 今後はrootユーザで作業が必要なとき(root権限が必要な時)は sudo コマンドを使っていきます なので基本的には作業ユーザはvagrantです。 51
sudo コマンドとは なんとなくみんな使ってるsudoコマンド。 めっちゃ簡単にいうと、 root権限でコマンドが実行したい時に使う なんとなくで使うと危険なので注意! 52
では早速 現在rootユーザではログインできないはずなので、 vagrant 再度ログインしなおします! コマンドはこんな感じ パスワード:password $ ssh vagrant@192.168.200.150 53
我が家の在宅作業環境 小休止① 54
必要パッケージの インストール 4 55
ゴリゴリサーバ構築していきますよーーー まずはパッケージをインストール! $ sudo yum -y update $ sudo yum
-y install httpd php 56
今何をしたか OSにインストールされているパッケージの アップデートがあるか探して、 あればアップデートするコマンド。 yum っていうのが、今回のCentOSで利用している パッケージマネージャ となります。 $ sudo
yum -y update 57
パッケージマネージャについて 有名なLinuxには、パッケージマネージャと言われる物が存在 どんなものか簡単にいうと、 パッケージを手動で一つインストールすることもできるけど、 このコマンドを介してインストールすることでアップデートなりアンインス トールを簡単にするための仕組み。 58
パッケージマネージャ、どんなのがあるの? 利用するOSによって違う物を使ってます R (Vagrant(Ubuntu)にHomebrewをインストールしようとする人が 多いこと多いこと…) RHEL系/CentOS/Amazon Linux系 → yum Debian系/Ubuntu系
→ apt Mac → HomeBrew Windows → chocolatey(ちょこれーてい、まだβらしい) 59
今何をしたか② yum コマンドを使って、Apache, PHPをインストール yumのリポジトリに存在している場合、 それぞれ一番新しいパッケージをインストールできます $ sudo yum -y
install httpd php 60
それぞれのバージョンをみてみよう 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
使ってるバージョンを調整するには ①パッケージマネージャを利用して ②最新版のミドルウェア(さっきインストールしたapacheとか)が 使いたい! = 結構難易度が高くなる (まあできなくは無いけども。) 63
とりあえず パッケージマネージャ使うと 「簡単にインストールできるし管理も楽」 だけど、 「特定のバージョンをインストールすること」 が結構しんどい ってことを覚えてもらえれば良いかと ※今回は時間の都合上このバージョンでいきます。 64
PHPからPDO経由でMySQLに接続するために必要なので インストールを。 最終的にデプロイするアプリのために必要です! あとこれも $ sudo yum -y install php-pdo
php-mysqlnd 65
Systemdって なんだ 5 66
さてさてそれでは ここからいっぱい単語がでてきますので覚悟♀ 67
まず、何も考えずに以下のコマンドを実行 そしたら $ sudo reboot で、一度サーバを再起動!起動したらもう一度ログインして $ ps auxww |
grep httpd $ sudo systemctl disable httpd $ sudo reboot $ ps auxww | grep httpd 68
Apacheが起動…? していないはず。 なぜなら、 $ sudo systemctl disabled httpd というコマンドを実行しているから。 69
はて Systemctl とは 70
Systemctlとは めちゃくちゃ簡単にいうと、 Systemdを動かすためのコマンド 71
Systemdとは Linux上で動作するプロセスの 起動状態を管理するシステム。 CentOSだとSystemdっていう 仕組みが採用されている。 SysVinit → Upstart → systemdと
時代の流れともに変わってきた (覚えなくて良い) 72
Systemdを使うと何ができるか 一番のメリットは Systemd経由でプロセスの 起動管理をすることができる 73
Systemdを使わないとどうなるか? (例)母国の違う人たちを起こす時、 それぞれの言語で起こさないといけない 74
こんな感じになる インド人 中国人 日系の血が混じってるフ ランス人 この人たちを起こさ ないと (起きてるけど) 起来啊 कृ
पया उ ठए Veuillez vous réveiller 75
Systemdを使うと systemdさんがそれぞれの人を起こしてくれる つまり、こっちからはsystemdさんに 指示すればよい 76
こんな感じになる インド人 中国人 日系の血が混じってるフ ランス人 中国の人起こして! インドの人 起こして! フランスの人 起こして!
起来啊 कृ पया उ ठए Veuillez vous réveiller 77
これをサーバに置き換えると 78
こんな感じになる MySQL apache Redis systemctl httpd start systemctl mysql start
systemctl redis-server start httpd -k start mysql.server start redis-server 79
systemdを使うと 起動時の処理をラップ(wrap)してくれるので、 ミドルウェア別に定義されたコマンドを 入力しなくて良いので、とても便利 80
他にも いろんなメリットがあります ・起動状態をモニタリングできる ・起動ログを一つの場所に吐ける ・自動起動の処理につなげられる 複数あるので今回は割愛 81
結論何が言いたいかというと Systemdを使うと、 Linuxのプロセス起動状態が管理できて、 かつLinux起動時に「どれを起動するか」 が選べる 82
さっきのコマンド これは、httpdプロセス(apache)を Linux起動時に自動的に起動させなくするコマンド systemdを使うと、サーバ起動時に 「何を自動的に起動させるか」 みたいなのも細かく設定できる $ sudo systemctl disabled
httpd 83
いろいろわかってきたところで 次はこれ! の後に、 で、一度再起動して、またログインした後に、 $ sudo systemctl enable httpd $
sudo reboot $ ps auxww | grep httpd 84
apacheのプロセスが立ち上がってませんか? 85
サーバが立ち上がった時に、 apacheを自動起動するよう 設定することができた 86
ターミナルソフト何使ってますか?? 結構使う頻度の高いソフトなので、こだわっても良いかも✨ 小休止② 87
必要パッケージの インストール② 6 88
次はMySQLをインストールしてみよう MySQLに関してはちょっと違うようにやってみる。 yumの標準リポジトリを使っても良いのだけど、 「お願いします!MySQL 5.7.30を使うことで 家族が救われるんです!!!」 という夢をみたので今回の要件としては 5.7.30をインストールすることにします。 89
いざ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
なぜMySQL一つインストールするのにこんなことし なきゃいけないのか 登場人物としては4人 ①mysql-community-common → まあ共通ライブラリだろきっと ②mysql-community-libs → これも共通ライブラリ ③mysql-community-client
→ MySQLに接続するクライアント ④mysql-community-server → これ!これがインストールしたい 91
なぜMySQL一つインストールするのにこんなことし なきゃいけないのか それぞれのパッケージがそれぞれを依存している ①mysql-community-common 何もなくてもインストールできる ②mysql-community-libs 何もなくてもインストールできる ③mysql-community-client インストールには②が必要 ④mysql-community-server
インストールには①③が必要 92
依存ライブラリの存在 この辺りがサーバ構築の難易度を 上げている気がする… 93
解決のコツ とにかくググる & 試す。 あとはちゃんとエラーを読んで 足りてないパッケージの情報を 読み取る。これだけ。 これが難しい。 94
MySQLのインストールは完了したので 設定を変更するスクリプトを流すよ! このスクリプトの中身までは今回は割愛 (パスワードの設定とかめんどくさかったので、僕が作ったお手製のスクリプトです) 一度mysqlを起動し、スクリプトを実行 $ sudo systemctl start mysqld
$ /vagrant/mysqlinit.sh 95
SSHポート フォワーディング とは 7 96
apacheのハローページを出してみよう! まずは何も考えずにブラウザを表示し、 http://192.168.200.150 にアクセス! 97
こんな感じでハローページ出ましたかね? 98
今何をしているか SSHでアクセスしている時に 気がついた人は気がついたと思いますが、 実はこのVagrantには[192.168.200.150]というIPが 設定されています。 今はブラウザから、 VagrantのローカルIPを利用して 直接アクセスしている状態♂ 99
ん? 前からこんな方法でアクセスしてたっけ 以前は localhost:3000 とかでアクセスしていたような 100
ってかそもそもlocalhostってなんだ localhostとは、自分自身を差す。 127.0.0.1っていうIPアドレスも、自分自身を差す。 つまり、カリキュラムでやっていたこれは同様の意味。 http://localhost:3000/ http://127.0.0.1:3000/ http://192.168.200.150:3000/ ↑ イマコレ 101
localhostを利用して自分自身に アクセスしていたのに、 なぜvagrant上にアクセスできていたんだ 102
Vagrantとローカルマシンの位置関係 ローカルマシン (MacなりWindowsなり) Vagrantfileより起動した 仮想マシン IP:192.168.200.150 103
Vagrantとローカルマシンの位置関係 確かに自分自身ではあるけど、 住んでる世界は別世界。 ローカルマシンとVagrantは 別の場所に存在している 104
正解は… ポートフォワード という技術を利用していました さてここからまた難しくなるよー 105
ポートフォワードとは めちゃくちゃ簡単にいうと、 「特定の宛先の通信」を、 「任意の宛先の通信」に、 変換できる技術。 なにそれすごい。 106
ポートフォワードのイメージ ローカルマシン (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
ポートフォワードの応用 ローカルマシン (MacなりWindowsなり) AWSとかその辺のサーバ 転送先はSSHでさえ繋がってしまえばVagrantでなくても応用可能なのです SSHトンネル SSH接続した時に 土管ができるイメージ IP:123.123.123.123 http://localhost:3000/
で Railsに接続や Railsの人 外のサーバにSSH転送をしてあげることで、 localhost:3000で外の環境に接続することもできる!!!(SSHが繋がってれば) ぶっちゃけあんま使わないけど 109
ポートフォワードのやり方 WindowsとMacで異なります♂ (異なるというか、設定の仕方が違うというか…) が、今回は一律SSHコマンドで 設定してみましょう 110
VagrantのApacheに localhost:8080で 接続する方法 Vagrantにターミナルで接続している人は一旦 xit でログアウト! その後に、このコマンドを入力して再度接続! $ exit $
ssh -L 8080:localhost:80 vagrant@192.168.200.150 111
localhost:80 ではない理由 めちゃくちゃ簡単にいうといろいろめんどくさい & セキュリティソフトとかでブロックされてる可能性が高い ので、localのポートは8080を選びました。 (いろいろあるけどあんま気にしないで←) 112
接続後の確認 ローカルマシンでブラウザを立ち上げて、 http://localhost:8080/ に接続! apacheのページが見えたでしょうか?? 113
SSHコマンドで何をしていたか 一個一個分解して考える $ ssh -L 8080:localhost:80 vagrant@192.168.200.150 -L ポート転送(SSHトンネル)を設定するオプション 8080
転送元のポートを設定 localhost 転送元の情報 80 転送先のポート vagrant@~~~~ 転送先の情報兼ssh接続先 114
つまり…? こういうこと $ ssh -L 8080:localhost:80 vagrant@192.168.200.150 localhost の 80ポート(http)
への通信を vagrant内 の 8080ポート へ転送する 設定を入れた状態で SSH接続するよ!!!!!!! (いやカラフルで逆にわかりづらいな) 115
ここらでちょっと考えてみよう ユースケースから落とし込んでみる ①ローカルの3000ポートを192.168.0.1の3000ポートに転送したい ②ローカルの1500ポートを200.200.200.200の2000ポートに転送したい ③1.1.1.1の13306へのアクセスを123.123.123.123のMySQLに転送したい 116
① $ 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
① $ 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
ここまでできたらみなさん SSHポートフォワード免許皆伝です ここまでできたら 120
カリキュラム進めてて、 こんな設定してたっけか いや、してないよな あれ?でも? 121
今まで、実はVagrantさんが この辺りの設定を代わりに してくれてました… 圧倒的感謝 実はVagrantさんが頑張ってくれてました 122
Vagrant環境のApacheにアクセスするときは、 さっきのSSH転送を使ってきましょう Vagrantさんの設定はちょっと割愛 ということで今日は 123
Switch買えた!!!!!!!!!!!!!!!!!!!! 勉強の時間削ってBotWばっかりやってる!!!!!!!! FFCCは青春のゲーム!!!!!!! 小休止③ 124
アプリケーションの デプロイ 8 125
サーバ構築が 徐々に進んできました さてさて 126
アプリケーションでも、 デプロイしてみますかね ちょっとここらで 127
今日はVagrant内ではgit clone 禁止 ♂ scp ってコマンド使って デプロイしますよ デプロイの時にgit clone は使うけど
128
SecureCoPy。 SSH形式で接続しながら、 ファイルのやりとりができる 超絶便利コマンド。 scp ってなんぞや 129
cp コマンドの使い方、 みなさん覚えてます?? 話は変わって 130
① cp test.txt hoge.txt ② cp test.txt hoge/fuga.txt ③ cp
~/test.txt ~/hoge/./ Q.このコマンドの実行結果を答えよ 131
① ディレクトリ内のtest.txt を hoge.txt って名前でコピー ② ディレクトリ内のtest.txt を hogeディレクトリ内、fuga.txtって名前でコピー ③
ホームディレクトリ内のtest.txt を ホームディレクトリ内の hogeディレクトリ内に test.txt って名前でコピー A. 正解は 132
今日は時間の都合上割愛 今後めちゃくちゃ出てくるので、 頭の中でイメージできるようにしておくと良い! 相対パス、絶対パスのお話 133
scpコマンドの使い方 基本形はこんな感じ $ scp ${コピー元のファイルパス} ${コピー先のファイルパス} では早速 134
scpコマンドの書式は基本的に cpコマンドと同様! 覚えやすいつくりですね そう、scpは 135
コピー元:ローカルにgit clone したソースコード コピー先:vagrant内の特定ディレクトリ これを実行したい 今回やりたいこと 136
scp コマンドを組み立てるとこんな感じになる ※ -r オプションは、ディレクトリを丸々コピーする時に必要 コマンドを組み立てる $ scp -r ~/Desktop/linux-handson/src/*
vagrant@192.168.200.150:/var/www/html/ 137
$ scp -r ~/Desktop/linux-handson/src/* vagrant@192.168.200.150:/var/www/html/ まずこの部分からみていく 138
コピー元のディレクトリ 各々 git clone したディレクトリを指定する この例だと、デスクトップ直下に git clone を 実行しているので、
~/Desktop/linux-handson/src/* って感じになる。 もちろん、デスクトップ直下にcloneしていない場合は 適宜読み替えてください! 139
*(アスタリスク)について ワイルドカードといいます♂ これ使うと、 ファイル一つ一つを 指定しなくても済むので楽 140
例えばこんな感じ ~Desktop/work/linux-handson |--README.md |--Vagrantfile |--mysqlinit.sh |--src ← ここの中身を全部転送したい、でも~~~~.phpっていうファイルを すべて指定するのはめんどくさい… |
|--CreateHtml.php | |--DBSettingConstructor.php | |--PDOWrapper.php | |--create.php | |--delete.php | |--index.php 141
アスタリスクを使わないと $ 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
アスタリスクを使うと $ scp -r ~/Desktop/linux-handson/src/* ${コピー先} 楽!!!!!!! 143
$ scp -r ~/Desktop/linux-handson/src/ vagrant@192.168.200.150:/var/www/html/ 次にこの部分 144
勘の良い人なら気がつくと思いますが、 SCPはSSHの接続を元にデータ転送しています 今までいっぱい打ってきたSSHコマンド $ ssh vagrant@192.168.200.150 今回打ってるSCPコマンド $ scp ${コピー元ファイル}
vagrant@192.168.200.150:${コピー先ファイル} 認証をしています 145
SSHで接続する時と同様の書き方になります 覚えやすくて良いね♂ そう、SCPの認証は 146
$ scp -r ~/Desktop/linux-handson/src/ vagrant@192.168.200.150:/var/www/html/ 最後にこの部分 147
一番最後はコピー先のディレクトリを 指定してます :/var/www/html/ これは、ログイン後の環境で、 絶対パス /var/www/html/ 以下に、 コピー元のファイルをコピーする、 って意味です♂ コピー先のディレクトリ
148
:/opt/data → ログイン後環境の /opt/data (絶対パス) :var/www → ログイン後環境の、 ログイン直後のホームディレクトリ以下の var/www
(相対パス) これが分かりづらいんだよな いくつか例 149
$ scp -r ~/Desktop/linux-handson/src/ vagrant@192.168.200.150:/var/www/html/ こうなる。 ポイントは、一つ一つを分けて考えること。 慣れるまで難しいかもだけど、慣れちゃえば簡単。 いや、ぶっちゃけRailsのform_for の引数覚える方が難しい気がするんだ…
以上を加味すると組み立て終わったコマンドは 150
それではソースコードを設置しよう! $ scp -r ~/Desktop/handson-linux/src/* vagrant@192.168.200.150:/var/www/html/ ローカルの環境から、 これを実行してください! ※winの人、 git
bashとか使ってもらえるとありがたいかも… 151
無事に、エラーに、なりましたかね? 無事にエラーになっていたら成功です (わざとこういう構成にしてます) さてエラーを読んで行きますよ〜 152
パーミッションと オーナー 9 153
パーミッションエラー…だと? 154
パーミッションて何 めちゃくちゃ簡単にいうと、 誰が、 何を、 どこまで、 操作できるか、 って感じです。 155
今回やろうとしたこと ローカルのファイルを vagrantユーザで 192.168.200.150のサーバ内の、 /var/www/html ってフォルダの中に、 コピー(書き込み)をしようとした $ scp -r
~/Desktop/handson-linux/src/* vagrant@192.168.200.150:/var/www/html/ 大きく関係あるところは色がついているところになります♂ 156
パーミッションを確認してみよう Vagrantに一度ログインして、 書き込みしようとしていたフォルダの パーミッションを見てみよう $ ls -l /var/www こんな感じでいろいろ表示されましたか?? 157
パーミッション(オーナー) is これ!!!!!!! ①ディレクトリとかファイルに 対してどんな権限(書き込み とか読み込みとか)があるか ②どのグ ループが 所有して いるか
③だれが 所有して いるか パーミッションの細かい説明はどこかの偉い人に任せるとして、 今回は手っ取り早くデプロイしたいので、 ②③のオーナーを変更しちゃいます! 158
ディレクトリ[html]は rootグループが保有している → rootグループの人なら誰でも操作できる rootユーザが保有している → rootユーザなら操作できる 159
そもそもLinuxには 「ユーザーグループ」が存在し、 グループに所属する形で 「ユーザ」が存在している 160
ちなみにたくさんユーザいます 161
/var/www/html のディレクトリは root グループに所属したユーザ or root ユーザでしか操作することができなかったのです 162
ってなわけで /var/www/html のディレクトリを vagrant ユーザでも操作できるように変更する vagrant にログイン後にこのコマンドを実行! $ sudo chown
vagrant:vagrant /var/www/html chown は ファイルとかディレクトリのオーナー、 オーナーグループを変更するコマンド 163
実行後 オーナーが変更になったか、 lsコマンドで確認してみますよ〜〜 $ ls -l /var/www こんな感じに変わってればオッケー 164
ローカルの環境から、 もう一度実行してください! こんどはうまく、転送できましたかね? それではもう一度scpを実行してみよう! $ scp -r ~/Desktop/linux-handson/src/* vagrant@192.168.200.150:/var/www/html/ 165
vagrant に ssh転送を設定するように設定し、ターミナルからログイン! こうなったらapacheにアクセスできるはずなので、 ローカルマシンからブラウザでアクセスしてみよう! http://localhost:8080/ では早速… $ ssh -L
8080:localhost:80 vagrant@192.168.200.150 166
何もページが表示されていない状態 になっていませんか? どうですか? 167
PHPが正常に動作していない状態 つまり、エラー状態です。 そうこれは 168
Railsの赤いエラー画面、 「優しいなぁ」 って感じませんか?? あれ出るとムカつくけど こういうのみると 169
トラブル シューティング 10 170
Railsのエラー画面に優しみを感じたところで、 出ているであろうエラーをみてみよう エラーが出力されているログファイルはこちら↓ /var/log/httpd/error_log 自由なコマンドを使って見てください headでも、tailでも、lessでも、catでも、vi -R でも、viewでも可。 root権限必要なので、sudo を頭に付けないとダメだよ!!!!!
(vimを使うのだ…) さて、トラシュー(トラブルシューティング)だ 171
エラーがでていませんか? こんな感じで 172
(PHP勢はちょっと自重) ローカルか何かでソースコード見て、 わかりそうな人いますか〜〜 エラーの中身、なんだか分かりそうな人 173
SyntaxError出てるし、なんかTypoっぽいな 誰だこんな明らかにデバッグ不足な クソコード書いたのは あれ、このソースコードもしかして… 174
① ターミナルで直接 vi で開いて修正 ②ローカルで修正してもう一回scpコマンドでサーバに転送 どっちでも大丈夫です ログファイルから修正箇所を探してみよう!! 言われた通りにソースコードを修正してみよう 175
修正箇所こちらです (wazato typo とかコメント残したの人生で初めてだ) わからない人へ 末尾に ; セミコロンが無い!!! → new
DBSettingConstructor(); 176
修正が終わったら、 もう一度ローカルのブラウザから アプリにアクセスしてみてください! http://localhost:8080 それでは最後に… 177
ブラウザでアクセスすると アプリ動いているよね!!! 嬉しい!!!!!! やったーーーーーーーー 178
最後に 11 179
本日のハンズオンは以上となります 長い時間お付き合い頂き、 本当にありがとうございました さてさて 180
• サーバ、rootユーザの概念、rootユーザの権限 • Systemdの概念、簡単な使い方 • パッケージマネージャの概念、簡単な使い方 • ミドルウェアのインストール • ssh、scpコマンドの使い方
• パーミッションの概念、解消方法 • エラーの読み方、慣れ方 • LAMP環境の構築 • 初学者がLinuxサーバ構築のとっかかりとなるちょっとした勘所 皆さんの今後の知識に繋がれば、とても嬉しいです。 本日勉強したこと 181
割と冗談抜きで 何回もぶっ壊そう!!!!!!! ローカル環境なんか、ぶっ壊したらまた作れば良いのと、 そのためのVagrantです。Scrap & Build で覚えるので、 臆せず、ぶっ壊しまくろう。 絶対に本番環境とかみんなが使ってる物ではやらないでね!!!!!!! さらに上達する、理解するためのテクニック
182
これやってみるとどうなるんだろ? こう変えるとどうなるんだろ? やってみても良いのかな? 思考よりも先に実行だ。 もし不安なら相談してください ぶっ壊すのが怖い人 183
「こんな話聞きたい」とか 「こんなハンズオンだったら参加したい」 みたいなの、バッチバチにお待ちしてます!!! 30秒で終わるのでよかったら感想ください https://forms.gle/JMxtk5C2bydnMgJ99 最後にアンケートご協力お願いできればと 184
終わりっす!!!!!! 最後に好きな絵文字で締めます To be continued …? 締めの言葉 185
Thanks! 全体通した質問や不明点、 「ここもっと聞きたい!」とか 「こんな感じに進めたら良いかも!」みたいな、 感想から質問までなんでもあれば!!!! 186