Webオペレーション研修 ログ #29

Open
orzup opened this Issue Jul 7, 2015 · 30 comments

Projects

None yet

2 participants

@orzup
Owner
orzup commented Jul 7, 2015

ログをどこに置こうか考えているので、決まるまでここにためておこう…。
ということでログだ!

@orzup
Owner
orzup commented Jul 7, 2015

2015/07/07

1.manual install

0.VirtualBox が Mac にインストールされていることを確認する

すでにはいってた!

1.VagrantでVM (CentOS 7) を作る

  • Vagrantはすでにはいってた!
  • vagrant init hfm4/centos7 でCentOS 7用のVagrantfileを作成した。
  • vagrant up でVagrantfileをモトにVMが作られた?
  • vagrant ssh でログインできた!

2.VM上のWebアプリにアクセス可能にする

  • MySQL対応する
    • Gemfileにmysqlを追加する
    • bundle install
    • CREATE DATABASE rails_tutorial_development DEFAULT CHARACTER SET utf8;
      MySQLでデータベースを作成する。それぞれの環境でつくる。
    • database.ymlを修正する
      database: に作ったデータベースの名前を、 socket: に自分のソケットの場所を書くんや。 mysql_config --socket で確認できるよ。
    • bundle exec db:create とかする
  • VM に Ruby 2.2 をインストールする

今日のつまづき

  • fixtures内のテスト用のデータを生成するところで、sqliteでしか読み込めないように記述されてた話
    <%= Time.zone.now %> から <%= Time.zone.now.to_s(:db) %> に書きかえた。to_sに:dbを引数であげると、今使ってるデータベースに合わせた形にしてくれるそうな。すごい!
    activated_at: nill も同じようにおこられたので activated_at: null に変更したら動いた。うまく調べられなかったけどこれでよいのだろうか…。
  • **ログはアナログに残せない。**つらい。
@orzup
Owner
orzup commented Jul 8, 2015

2015/07/08

  • VM に Ruby 2.2 をインストールする

    • yum install ruby じゃ2.0が入ってしまう、だめだ

    • wgetを使うとよい

    • wgetが入っていないのでsudo yum install wget

    • wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz

    • 解凍する前に、Rubyをどこに置くか考える

      /opt/ ディレクトリーは、通常デフォルトインストールの一部ではないソフトウェアやアドオンパッケージ用に確保されています。

    • とのことなので /opt/ruby-2.2.2 な感じで

    • tar zxvf ruby-2.2.2.tar.gz で解凍する

    • ./configure でMakefileを作成する

    • gccが必要だといわれたので yum install gcc

    • リトライ、./configure でMakefileを作成する

    • make でコンパイルする

    • sudo make install でインストールする

    • ruby -v で確認すると ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] と表示された!やった〜

    • PATHを通そう
      .bash_profileexport PATH=$PATH:/opt/ruby-ruby-2.2.2 を追加した

  • VagrantにRailsが動く環境を用意する

    • Railsいれるぞ〜 gem install rails --no-document →だめだった
    ERROR:  Loading command: install (LoadError)
      cannot load such file -- zlib
    ERROR:  While executing gem ... (NoMethodError)
      undefined method `invoke_with_build_args' for nil:NilClass
    
    • zlibがないっていってるから sudo yum install zlib
    パッケージ zlib-1.2.7-13.el7.x86_64 はインストール済みか最新バージョンです
    何もしません
    

    ???????

    • 調べてみら zlib だけじゃなくて zlib-devel がいるそうな

      CentOSなどではコンパイルに必要なファイルをまとめたパッケージには後ろに-develという名前が付くようになっています。ライブラリそのものはヘッダファイルがなくても動作するため、パッケージが分割された状態になっていることがほとんどです。

    • ということで sudo yum install zlib-devel

    • リトライ./configure

    • make

    • sudo make install

    • ruby -v

    • よっしゃRailsいれるぞ〜 gem install rails --no-document →エラーは変わった!!!

    ERROR:  While executing gem ... (Gem::Exception)
      Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
    
    • openssl が足りないご様子
    • yum search openssl で確認すると openssl-devel があるぞ
    • sudo yum install openssl openssl-devel でインストール
    • リトライ
      ./configure
    • make
    • sudo make install
    • ruby -v
    • よっしゃRailsいれるぞ〜 gem install rails --no-document →エラーは変わった!!!
    ERROR:  While executing gem ... (Gem::FilePermissionError)
      You don't have write permissions for the /usr/local/lib/ruby/gems/2.2.0 directory.
    
    • 安易なsudo
    sudo: gem: コマンドが見つかりません
    
    • sudoだとパスが通ってない
    $ env | grep PATH
    PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/sbin:/home/vagrant/bin:/opt/ruby-ruby-2.2.2
    $ sudo env | grep PATH
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    
    • sudoのときのパスは /etc/sudoers の中に記述されてる。のでここをいつものパスをよんでもらうように変更する
    • sudo gem install rails --no-document →パス通った!けど新たなエラーが。
    Building Nokogiri with a packaged version of libxml2-2.9.2
    
    • ログに言われた通り sudo yum -y install libxml2 libxml2-devel だ!
    • sudo gem install nokogiri -- --use-system-libraries --no-document でNokogitiをインストールだ!と思ったら libxslt もいるようだ!
    • sudo yum -y install libxslt libxslt-devel だ!
    • 再びsudo gem install nokogiri -- --use-system-libraries --no-document →うまくいったぞ!
    • sudo gem install rails --no-document →やった〜!
  • VM上で rails s -b 0.0.0.0 -p 80 を実行

    • ひとまずgitをいれよう sudo yum install -y git

    • どこにcloneする?→/srv/ にしよう!

      /srv/ ディレクトリーには、Red Hat Enterprise Linux システムが提供するサイト特有のデータが含まれています。このディレクトリーは、ユーザーに対して FTP、WWW、または CVS などの特定のサービス用のデータファイルの場所を提供します。

    • sudo git clone -b change_to_MySQL https://github.com/orzup/rails-tutorial.git でうにうにclone

    • bundle installmysql2 がインストールできないようす

    • sudo gem install mysql2 -v '0.3.18' → headerが足りない

    • sudo yum install mysql-devel

    • sudo gem install mysql2 -v '0.3.18' → できた!

    • bundle install →できた〜!


今日のつまづき

  • make distclean してからRubyをリビルドしたらきちんとopensslを反映してくれたぞ!
@orzup
Owner
orzup commented Jul 9, 2015

2015/07/09

  • VM上で rails s -b 0.0.0.0 -p 80 を実行の続き

    • DBつくるぞ! bundle exec rake db:create → JavaScript runtimeがないそうだ
    rake aborted!
    ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.
    
    • See https://github.com/rails/execjs なんだか therubyracerDuktape.rbNode.js の3択っぽい?

      ExecJS supports these runtimes:
      therubyracer - Google V8 embedded within Ruby
      therubyrhino - Mozilla Rhino embedded within JRuby
      Duktape.rb - Duktape JavaScript interpreter
      Node.js
      Apple JavaScriptCore - Included with Mac OS X
      Microsoft Windows Script Host (JScript)

    • どれがいいとかわからないのでみんなに聞いてみた

      therubyracer はたくさん地雷があってつらかった
      therubyracer はたくさん地雷があってつらい思い出があるからNode.jsにした

    • 地雷は踏んだ数だけ強くなれるらしいから therubyracer にしよう!

    • そういえば、何かと libv8therubyracer のバージョンの組み合わせが大切だった気がしたなあ

    • 何かを ruby -rubygems -e 'puts Gem::Platform.new(RUBY_PLATFORM)' で確認

    x86_64-linux
    

    これにマッチするものをから選択する

    • sudo gem install libv8 -v '3.11.8.3' -- --with-system-v8 で合うバージョンをインストール
    • sudo gem install therubyracer -v '0.11.0' -- --with-v8-dir で合うバージョンをインストール→ gcc-c++ が足りない
    ERROR:  Error installing therubyracer:
      ERROR: Failed to build gem native extension.
    〜〜〜
    make: g++: コマンドが見つかりませんでした
    
    • sudo yum install gcc-c++
    • sudo gem install therubyracer -v '0.11.0' -- --with-v8-dir → だめだ
    /usr/local/lib/ruby/gems/2.2.0/gems/libv8-3.11.8.3-x86_64-linux/vendor/v8/out/x64.release/obj.target/tools/gyp/libv8_base.a: シンボルを読み込めませんでした: 不正な形式の書庫です
    collect2: エラー: ld はステータス 1 で終了しました
    
    • libv8 がおかしい?
    • 0.11.0問題 なるものがある?????!!!??!
      参考
    • sudo gem install therubyracer -v '0.11.0beta8' -- --with-v8-dir →はいった!!!!
    • bundle exec rake db:create → あ、あれ??だめだ?????
    ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime.
    
    • kasumin: のコメントの日付をみよう
      miso: 2012年!古い!!!
      昔は依存関係がtherubyracerになかったから自分でバージョンをあわせてあげなきゃいけなかった。
      が、今は昔。最近ではRUNTIME DEPENDENCIESにかいてある、のでインストールするときにきちんと libv8 もインストールされる!すごい!
    • kasumin: そもそもbundlerは何をしている?
      bundlerはgemのバージョンを管理してくれる。Gemfile.lockをみてインストールするバージョンを判断する。
      記載されていないものはローカルにあろうがなかろうが使わない、使えない!
      これまではたまたまローカルにもherokuにもnode.jsがはいっていたから JavaScript runtime がない!と怒られてなかっただけ。
    • ということでいれたものはさよならします sudo gem uninstall therubyracer libv8
    • Gemfileに therubyracer を追加する
    • bundle exec rake test → エラーかわったぞ!次は readline-devel がないそうな
    • sudo yum -y install readline-devel
    • Rubyのリビルド…
    • bundle exec rake test → MySQLのエラーにかわった!
    Mysql2::Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    
    • MySQL用意するぞ、と思ったらCentOSではMariaDBなるものを使うようだ。
    • sudo yum install -y mariadb-server を追加。develはすでに入ってた
    • /etc/my.cnfcharacter-set-server=utf8 を追加
    • systemctl enable mariadb.service で有効にして
    • systemctl start mariadb.service で起動する
    • sudo mysql_secure_installation でMariaDBの初期設定をしよう
    /usr/bin/mysql_secure_installation: 行 379: find_mysql_client: コマンドが見つかりません
    
    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
          SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
    
    In order to log into MariaDB to secure it, we'll need the current
    password for the root user.  If you've just installed MariaDB, and
    you haven't set the root password yet, the password will be blank,
    so you should just press enter here.
    
    Enter current password for root (enter for none):
    OK, successfully used password, moving on...
    
    Setting the root password ensures that nobody can log into the MariaDB
    root user without the proper authorisation.
    
    Set root password? [Y/n] n
    ... skipping.
    
    By default, a MariaDB installation has an anonymous user, allowing anyone
    to log into MariaDB without having to have a user account created for
    them.  This is intended only for testing, and to make the installation
    go a bit smoother.  You should remove them before moving into a
    production environment.
    
    Remove anonymous users? [Y/n] Y
    ... Success!
    

    匿名ユーザーはいらない

    Normally, root should only be allowed to connect from 'localhost'.  This
    ensures that someone cannot guess at the root password from the network.
    
    Disallow root login remotely? [Y/n] Y
    ... Success!
    

    rootユーザはローカルからだけ許す!

    By default, MariaDB comes with a database named 'test' that anyone can
    access.  This is also intended only for testing, and should be removed
    before moving into a production environment.
    
    Remove test database and access to it? [Y/n] Y
    - Dropping test database...
    ... Success!
    - Removing privileges on test database...
    ... Success!
    

    プロダクション用のデータベースをのっけるので、テスト用のデータベースは消す。

    Reloading the privilege tables will ensure that all changes made so far
    will take effect immediately.
    
    Reload privilege tables now? [Y/n] Y
    ... Success!
    

    privilege tables は権限テーブルのこと。MySQLはユーザーの権限もテーブルとして保持している。
    権限を修正しても、すぐには権限テーブルに反映されない。先ほど匿名ユーザーを消したので、権限テーブルを今すぐに読み込み直してもらおう。

    Cleaning up...
    
    All done!  If you've completed all of the above steps, your MariaDB
    installation should now be secure.
    
    Thanks for using MariaDB!
    

    無事にできた!

    • CREATE DATABASE rails_tutorial_production DEFAULT CHARACTER SET utf8; でテーブルを作る!
    • socket の場所がちがうのでdatabase.ymlを修正する
    • bundle exec rake db:create
    • bundle exec rake db:migrate
  • ブラウザで表示を確認する

    • Vagrantfileに config.vm.network "forwarded_port", guest: 80, host: 8080 を記述して
    • すでにVMは動いているので vagrant reload で設定を反映する
    • see http://localhost:8080/ → だめだった
    • 天の声: ふぁいあうぉーる
    • sudo firewall-cmd --list-all
    • sudo firewall-cmd --add-service=http --zone=public
    • sudo systemctl restart firewalld (設定がもとにもどった)
    • あれうごかない???
    • sudo firewall-cmd --add-service=http --zone=public --permanent
    • sudo systemctl restart firewalld (永続化されてるのでちゃんとhttpが追加された)
    • 動いた!!!!!🍣🍺

3.WEBrickからNginx + Unicornに切り替える

  • Nginx のインストール

    • sudo yum install nginx
    パッケージ nginx は利用できません。
    

    !!!!??!?!?!


今日のつまづき

  • TODO:MySQLのユーザーを作成する
  • 最新の情報をみよう
@orzup
Owner
orzup commented Jul 9, 2015

WEBサーバ、むずかしい
TODO:rackをしらべる
2015-07-09 18 56 40

@orzup
Owner
orzup commented Jul 9, 2015

成長した
2015-07-09 20 51 35

@orzup
Owner
orzup commented Jul 9, 2015

要調査物件:

あなたがいっているWebサーバーとは本当にWebサーバーなのでしょうか

@orzup
Owner
orzup commented Jul 10, 2015

おぼえがき
2015-07-10 19 18 14

@orzup
Owner
orzup commented Jul 10, 2015

2015/07/10

  • Nginx のインストール

    • sudo yum install nginx
    パッケージ nginx は利用できません。
    

    yumは /etc/yum.repos.d/ 以下のパッケージを参照する。Nginxはない!ということでNginxを追加しよう。

    • sudo rpm -i http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm で追加する。URLは本家からCentos7用のものをもってくる。
    • yum search nginx すると、nginxが追加されている!
    • sudo yum install nginx → 成功!
    • sudo systemctl enable nginx.service で有効にして sudo systemctl start nginx.service で起動する
    • sudo systemctl status で無事動いていることがわかるね
      curl -i http://localhost で初期ページがみれる(CentOSだとはいってるみたい)ので安心安心
  • Unicorn を動かすためにアプリケーションを修正

    • Gemfileに追加

    • config/unicorn.rbを追加

    • .Procfileを修正

    • プロダクション環境で動くか確かめてみる

      • sudo S3_ACCESS_KEY=a S3_SECRET_KEY=a RAILS_ENV=production rails s -p 80 -b 0.0.0.0
        S3_ACCESS_KEYとS3_SECRET_KEYは何か入ってないと動かないのでテキトウにいれてる…
      • うごかない!
      Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`
      
      • export SECRET_KEY_BASE=とても長い文字列
      • うごかない! → sudoでrails sしているので、環境変数が引き継がれないのが原因
      • -E をつけるとユーザーの環境変数を保持してくれる!ので sudo -E S3_ACCESS_KEY=a S3_SECRET_KEY=a RAILS_ENV=production rails s -p 80 -b 0.0.0.0
      • とてもプレーンだけどうごいた!
  • そういえばVM上でのテストが落ちていた

    • ImageMagick忘れ
    • sudo yum install ImageMagick ImageMagick-devel
  • そういえばTravis CIが落ちていた

    • MySQLのソケットの場所不一致問題
    • test環境ではSQLiteを使うことにした
  • Nginx と Unicorn を繋ぎこむ (socket)

    • 迷走期ここから
    • NginxのsocketとUnicornのsocketの場所を同じ場所にする
      sudo vi /etc/nginx/conf.d/default.conf に追加する
    upstream unicorn {
      server unix:/opt/rails-tutorial/tmp/sockets/unicorn.sock;
    }
    

    sudo vi config/unicorn.rb に追加する

    listen "#{Rails.root}/tmp/sockets/unicorn.sock"
    
    • Unicornのpidの場所を明記する
      sudo vi config/unicorn.rb に追加する
    pid "#{Rails.root}/tmp/pids/unicorn.pid"
    
    • nginx -t で文法チェックしてくれる!
    • sudo systemctl restart nginx.service で再起動
    • sudo systemctl status nginx.service をみると動いている!
    • sudo bundle exec unicorn -c config/unicorn.rb -E production -D → うごかない!!!
    • ログが出なくてとても辛いので、ログをはいてもらうように記述しよう
    stderr_path "#{Rails.root}/log/unicorn.stderr.log"
    stdout_path "#{Rails.root}/log/unicorn.stdout.log"
    
    • 迷走期ここまで
    • とてもたくさん迷ったがなんとかできた
      • nginxのconfigはunicornとつなぐ用のものを持ってこよう。それを編集しよう(パスとかユーザーとか)。
      • nginxとunicornのsocketのパスは同じ場所にしよう
      • nginxのconfigを修正したら sudo systemctl restart nginx
      • unicornの起動は sudo -E bundle exec unicorn -c config/unicorn.rb -E production
      • rails-tutorial/tmp/sockets rails-tutorial/tmp/pids をつくる
    • とてもプレーンに表示されてつらいので sudo bundle exec rake assets:precompile
    • 表示された!!!!!!
    • メールが送れない
      • わたしはherokuではないので config/environments/production.rb のhostを localhost:8080
      • そういえば環境変数がなかった export LOLIPOP_MAIL_USERNAME= export LOLIPOP_MAIL_PASSWORD=
    • おくれた!!!!!

今日のつまづき

  • つまづきしかなかった!!!!!!
@orzup
Owner
orzup commented Jul 13, 2015

2015/07/13

  • httpsで接続できるようにするぞ

    • config/environments/production.rbconfig.force_ssl をtrueにしてみた
    • show https:///localhost:8080 → 案の定SSL接続エラー
    • 証明書がないのが原因
    • 証明書を作ろう
      • 普通は認証局から買う?
      • 今回は自分で発行自分で認証、オレオレ証明でゆく
      • [TODO]ここらへんきちんとまとめよう
    • sudo openssl genrsa -des3 -out server.key 2048 -sha256
    • sudo openssl req -new -sha256 -key server.key -out server.csr
    • sudo cp server.key server.key.org
    • sudo openssl rsa -in server.key.org -out server.key
    • sudo openssl x509 -req -days 3650 -sha256 -in server.csr -signkey server.key -out server.crt
    • 鍵や証明書たちは /etc/nginx/ssl/ においてみた
    • 設定をする
    proxy_set_header X_FORWARDED_PROTO https;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;
    proxy_pass http://app_server;
    

4.test

  • じょうのVagrantfileでやることに
  • ローカルに設定している環境変数を読み込んでくれるそうなので、セットする
    足りないと怒られる。
  • うまく vagrant up できたら、いよいよテスト。
  • serverspec-init をした様子
  • どんなテストがいるか考えて、順に実装してゆく方針になった。

今日のつまづき

  • 環境変数が足りないと怒られる
@orzup
Owner
orzup commented Jul 13, 2015

📝
img_6845

@orzup
Owner
orzup commented Jul 14, 2015

2015/07/14

  • 無事に serverspec のテストを書き終えた(ひとまず)
  • おかわりだ!
  • Infrataster のテストをかくぞ!
  • なんで書くのかわからなくなってきた
  • そもそもブラックボックステストなので、外からのふるまいが担保できればよい?
  • 443番でアクセスしたらホームが見られたらよいのでは?

今日のつまづき

  • 正規表現は書いた後にもういちど確かめよう

今日のハイライト
2015-07-14 15 07 01

@orzup
Owner
orzup commented Jul 14, 2015

img_6860

@orzup
Owner
orzup commented Jul 15, 2015

2015/07/15

(スケブ1冊おわったぞ…!)
img_6862

@orzup
Owner
orzup commented Jul 16, 2015

2015/07/16

joe's memo
img_6864
(構成図、今度まとめてみよう…)

@orzup
Owner
orzup commented Jul 17, 2015

2015/07/17

img_6876

@orzup
Owner
orzup commented Jul 21, 2015

2015/07/21

今週はsuzupyといっしょに向上心を高めるぞ!
img_6930

@orzup
Owner
orzup commented Jul 22, 2015

2015/07/22

img_6938

@orzup
Owner
orzup commented Jul 23, 2015

2015/07/23

img_6957

@orzup orzup changed the title from WebオペレーションのVagrant編 ログ to Web研修オペレーション ログ Jul 27, 2015
@orzup
Owner
orzup commented Jul 27, 2015

2015/07/27

れぷりけーしょんのはなし
img_6986

@orzup
Owner
orzup commented Jul 27, 2015

すくすく育つ!
img_6988

@orzup
Owner
orzup commented Jul 28, 2015

2015/07/28

img_6990

  • 続きはまた明日!

myslqのreplication構成はこれが大変に納得感があるのでよむとよいよ
http://sfujiwara.hatenablog.com/entry/20110621/1308625519

@orzup
Owner
orzup commented Jul 29, 2015

2015/07/29

今日は豪華2本だて!
img_6995
img_6996

@orzup orzup changed the title from Web研修オペレーション ログ to Webオペレーション研修 ログ Jul 29, 2015
@orzup
Owner
orzup commented Jul 30, 2015

2015/07/30

今日は実装に悩む日だった。原因究明力が足りない!!!!

@orzup
Owner
orzup commented Jul 31, 2015

[WIP]2015/07/31

🍺

@hfm
hfm commented Jul 31, 2015

ば、バリューは

@orzup
Owner
orzup commented Jul 31, 2015

も、もうしわけないていどのwipをのこしておきました…🍻

@orzup
Owner
orzup commented Aug 3, 2015

2015/08/03

引き継ぎで一生懸命だった!

  • PRはコミットで追えるように意識しないとなあと改めて思った
  • ストレージサーバのこと全然わかってないのに引っ越してきたらストレージサーバの分離が既にできていたので、仕組みを考える必要があるなあ
    • なぜNFSを選んだとか
    • きゃりあうぇーぶとはなんだったのかとか
@orzup
Owner
orzup commented Aug 4, 2015

2015/08/04

実装に励む日々なので、スケブバリューがでてない…明日はリバースプロキシとロードバランサの違いを調べれるといいな。
img_7055

@orzup
Owner
orzup commented Aug 6, 2015

2015/08/06

感謝のdeployな1日🙏
〆切で随分おざなりなPRレビューしたりヨクナイなあと思うことが多かった。〆切とはこういうことなのか…

@orzup
Owner
orzup commented Aug 7, 2015

2015/08/07

成果を共有する会のまとめ!
img_7083

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment