サーバー構築で詰まった話

はじめに

VPSrailsで作成したサービスを公開する時、 サーバー(≒VPS)設定につまずきました。

初心者(=私)がサーバー設定につまずいた理由

僕が思うにサーバー設定が障害となる最大の理由は 今までやっていた開発(js、rubyphp・・・)と別の知識 が要求されることです。

1.ネットワーク系の単語の意味がわからない。(リバースプロキシ?、ポート?、vim?)

2.サーバー構築するために何をすべきかわからない。(DB設定、ファイアウォール・・・)

3.linuxコマンドの習熟度

上記3つはVPSを扱う上で初歩的な話だと思います。 ただ、私は全く知らずにVPSをの黒画面と格闘していました。

その他理由

加えて、サーバー構築を行なう場合、目に見える世界ではないので エラーが出た時、どう対処して良いのかわかりません。

logファイルを読めば対処出来るのですが、 logを読むという基本を意識していなかったので苦労した経験があります。

サーバー勉強しなくては

とまあ、つらつら書いてきましたが、

サーバーはhtml、js、rubyとは違った方面の知識が必要とされます。

なので、慣れるまでは概念やらコマンドやら勉強する必要があります。

このブログで少しずつまとめていけたらと考えています。

nginx 特徴

最近、nginxでサーバー構築を行っているので、メモがてらブログでまとめます。

webサーバーとは

ブラウザ(chromesafari)のリクエスト(例えば、http://www.hatena.ne.jp/にアクセス) に対して自身の返すデータを返す役割を持っています。

ブログを例に取ると、「はてなブログにある私の2月1日の記事」のリンクをクリックした場合、 2月1日の記事をアプリケーションに問い合わせをして記事(HTMLなど)を返す役割です。

つまり、ブラウザとアプリケーション(railsではアプリケーションサーバー) の橋渡しの役割をしています

nginxの特徴

1性能が高い

他のサーバー(僕はnginxしか知らないですが・・・) 同時接続数が増えても落ちづらいと言われています。

ググったら色々とあります。 Qiita記事

2ロードバランサ、リバースプロキシ

nginxはロードバランサ、リバースプロキシの設定が容易なのが特徴です。

3設定ファイルの構造がシンプル

ログファイルを確認するときは /logなど直下的にわかりやすいディレクトリ構造だと感じました。 (他のサーバーは知らないので

次回はリバースプロキシ、ロードバランサをまとめます。

【linux】パフォーマンス確認に使えそうなコマンド メモ

free

メモリの使用状況を表示

オプション

-m メガバイト単位で表示

-t 仮想メモリと物理メモリを表示

仮想メモリ・・・hdd ssdなどのストレージで物理メモリを代替。物理メモリと比較して速度遅い  

vmstat

メモリやCPUの使用状況を表示

watch

定期的にプログラムを実行し、実行結果を出力

オプション -n 間隔を指定

watch -n 5 free #5秒間隔でメモリの使用状況を表示

【python】 numpyメモ

sqrt 平方根

import numpy as np
np.sqrt([1,2,3])
# array([ 1.        ,  1.41421356,  1.73205081])
np.sqrt(2)
# 1.4142135623730951

dot 内積

 v1 = [1,2,3]
 v2 = [2,3,4]
 np.dot(v1,v2) #20

degrees radianを返す

np.degrees(3.14) 
#179.90874767107849
np.degrees(np.pi)
#180
#np.piは円周率 (≒3.1415926)

power 累乗

np.power([1,2,3],2) #配列要素をそれぞれ2乗
#array([1, 4, 9])

正規表現 最短マッチ

最短マッチ

躓くことが多いのでメモ。

最短マッチを考える際には通常マッチから考えるとわかりやすい。

  • 通常マッチは一番長いパターンをマッチ
  • 最短マッチは一番短いパターンをマッチ

通常マッチは一番長いパターンと認識することが重要

例) テキスト例:「hoge」「hoge2」

ケース1 通常マッチケース /「.+」/ →この場合  と の範囲をマッチ。 テキスト例では「と」が一番長い範囲をマッチさせます。

ケース2 最短マッチケース /「.+?」/

→この場合  と のパターンの最短ケースを マッチさせます。 ポイントは量指定子(?や*)の前に? をつけることです。 (量指定子はなれるまであまり考えなくては良いかも)

hoge = "「hoge」「hoge」"

puts hoge.scan(/「.+」/)[0]  #→["「hoge」「hoge2」"]
puts hoge.scan(/「.+?」/)[0] #["「hoge」"]

【rubyメモ】evalメソッド

evalとは

入力された文字列をrubyのコードとして解釈出来ます。 evalはKernel moduleに属しています。 kernel moduleはobjectクラスに属しているため、 全てのクラスで使用出来ます。

コード例

test = "aiueo"
test2 = "test2"

eval("puts test")   #aiueo 
eval("puts 'test2") #test2

【ruby】yieldとブロックの関係

yield

メソッドの中でyieldを実行すると、受け取ったブロックを実行します。

コード例

ブロックとは method do |ブロック変数| ~ end で囲われている処理のことです。

yieldをわかりやすく明記するためにブロック変数を省略した形で書いてみました。

@count = 1

def yield_test
  puts @count # a
  @count += 1 
  yield       # b
  puts @count # c
end

#ブロック
yield_test do #yield_test実行 → a b cの順に実行される
  puts @count #b yieldからブロック処理実行
  @count += 1 #c @countを1増やされる。
end

#1,2,3と出力

yield処理を入れた際はブロック処理をmehodに追加することが出来ます。 追加処理を入れる際、便利な気がします。

ちなみにブロックが渡されたか判別するのは block_given? methodを用います。

@count = 1

def yield_test
  puts @count # a
  @count += 1 
  yield if bloc_given? # true→yield実行 今回はfalseなので実行されない
  puts @count # c
end

#ブロック
yield_test

#1,2と出力