プログラミング Tips

ITエンジニアの雑記ブログ。
IT関連ニュースの考察や、プログラミングに関するTipsの備忘録として…
育児や日常の雑記帳としても、記事を投稿していきます。

プログラミングと日常生活に関する情報を発信しています。

SSH conf を簡単に接続する方法まとめた!

ConoHa VPSに、Debian OSを構築し、WEBアプリをデプロイする方法をまとめた。
その折、サーバーにSSH接続環境を構築することが最初のSTEPにあったが、毎回SSHコマンドにオプション、秘密鍵のパス、ホスト名、ユーザー名などを付与するのは手間…

今は管理する環境が限られているから問題ないが、今後増えて行くことを考えると、効率的に慣るする方法がないか?を調べてみた。

その結果、SSHコマンド専用のconfigファイルを準備し、その中に設定情報をまとめて記入しておくことが可能ということがわかった!!

これは便利だ!!

ということで、以下にその情報をまとめてみた



環境

クライアントPC

  • MacOSX 10.13.4
  • OpenSSH_7.6p1, LibreSSL 2.6.2

サーバー

サーバー側の環境には依存しない
但し、サーバーサイドのsshd_configファイル内の設定は、下記同等であることを前提とする。

#sshd_config設定内容
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no

サーバーの環境構築とSSH設定の詳細に関しては、
ConoHa VPS の Debian9 に Djangoベースのサービスデプロイしてみた!!〜その①〜
を参照

ゴール

今回ssh_donfigを取り入れると、下記1行でサーバーに一発接続が可能になる

$ ssh hoge.com

これまで使っていた

$ ssh -i "秘密鍵" <username>:<HostName> -p <Port番号>

など、秘密鍵やポート番号、サーバーのユーザ名やホスト名の入力が不要になる

この設定で幸せに慣れること

  1. とにかく、毎回面倒な入力が減る!
  2. gitなどの分散型チーム開発で無駄な設定が減る&管理しやすくなる!

早速、その為の手順を以下にまとめる



Step1. 設定ファイルの編集

MacOSXの場合、~/.ssh/ssh_configファイルに設定情報を入力する為、下記コマンドから編集する

vi ~/.ssh/ssh_config

もしviエディタに不慣れな場合は、nanoエディタでもOK!

<ポイント>
パスにある通りこの設定ファイルは、現在のユーザーに限定して有効である。
管理者権限のユーザーに共通した設定を準備する場合には、
/etc/ssh/ssh_config
に入力する必要がある

Step2. サーバー接続の為の情報を追記

まず記述項目を以下に列記

キーワード 内容
Host ホスト名
HostName ホストのアドレス
User ログインユーザー名
IdentitiesOnly 秘密鍵が必要か?
IdentityFile 秘密鍵ファイル(パス含む)
Include 分散したconfigファイル読込む(分割/分散管理を実現)
Port 接続用ポート番号(Default:22)
ServerAliveInterval サーバー応答なしの場合、タイムアウトまでの時間(秒)
TCPKeepAlive サーバー接続を継続するか?


この他にも様々な設定キーワードがある。詳細を確認する場合は、下記コマンドで確認可能

$ man ssh_config

必要なキーワードをssh_configファイル内に記載
今回は下記情報と仮定して入力する。

<ポイント>
Hostをメインに、それ以外の設定内容はインデントを下げること!

#hogehoge.net
Host hogehoge.net
  HostName xxx.xxx.xx.xxx
  User hoge
  IdentityFile ~/.ssh/id_rsa_secret_key

Step3. サーバーに接続

下記コマンドでサーバーに接続する

# ssh <ホスト名>
$ ssh hogehoge.net

下記エラーが発生した場合する可能性

ssh: Could not resolve hostname hogehoge.net: nodename nor servname provided, or not known

エラーは~/.ssh/ssh_configを参照できていないことが原因と考えられる為、該当するssh_configファイルをオプション指定する

$ ssh -F .ssh/ssh_config hogehoge.net

もしくは、/etc/ssh/ssh_config<STEP.2> の追加内容を記載

以上、完了!!



ConoHa VPS Debian9 からDjangoアプリをデプロイしてみた!!

この記事は、
ConoHa VPS の Debian OS に Djangoベースのサービスデプロイしてみた!!Debian9 に Python3系をインストールしてみた!の続編。前回は、

  1. ConoHa VPSで サーバー設置
  2. SSH接続の設定
  3. Pyhon3.6をソースコードのビルド&インストール

までを行なった。
今回は宣言通り、デプロイに必要なソフトのインストールから各種設定を行う第三弾!

  • git
  • Django
  • Apache2

ちなみに今回の開発環境は、Pythonの仮想環境上に構築することとする(※仮想環境の構築に関しては、こちらの記事を参照)。また開発リソースは全てGitによって管理する。以上から、サービス必須パッケージは全てGitリポジトリ経由で、デプロイ環境にインポートできることとする。

大きく3つの設定(Apache2の設定mod_wsgiの設定Djangoアプリの設定)が存在している為、当初は複雑に感じるが、一つずつ設定していくことでデプロイが完了した時には、全体像が見えるようになっていることを期待する。

環境紹介などのおさらいから…



環境

クライアント(手元)のPC

  • MacOSX 10.13.4

サーバー "ConoHa VPS"

  • Debian 9
  • Apache2.4.25(Debian)
  • Python 3.6.5
  • Django 2.0.2
  • pip3 9.0.1
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

将棋AIで学ぶディープラーニング [ 山岡忠夫 ]
価格:3434円(税込、送料無料) (2018/4/12時点)

前回のおさらい

STEP.1:ConoHa VPSで、[Debian9]ベースのサーバーを追加
STEP.2:サーバーの初期設定
STEP.3:Python3.6のインストールと設定

上記STEP1,2に関しては、こちらを参照
上記STEP3に関しては、こちらを参照

STEP.4:Djangoサービス デプロイの準備

  1. gitのインストール
    以下のコマンドでインストール完了。バージョン名が表示されればOK!

    # apt-get install git
    # git --version
    git version 2.11.0
  2. 外部リポジトリ(git)から、DjangoベースのサービスをPull

    # git clone https://github.com/YYYYYY/XXXXX.git
    # git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/master
    上の例ではmasterブランチに属していることがわかる。デプロイ環境では基本的にソースコードに手を加えないので、常にこのmasterブランチをデプロイ環境とすることで問題ない(※Tagをつけておくと管理しやすくなる)
    GitHub, BitBucketなどPublicのリポジトリからクローンするもよし、プライベートなGitサーバーからクローンするもよし。
  3. サービス動作必須モジュールのインストール(Django etc...)
    開発環境では、Python仮想環境上で環境構築をしたので、今回もそれにならって仮想環境を準備してその中に必須コンポーネントをインストールすることとする。

    # cd <gitリポジトリのパス>
    # 仮想環境の準備
    # python3.6 -m venv venv
    # source venv/bin/activate
    (venv) #

    上記手順によって、gitリポジトリをクローンしたフォルダ内にvenvフォルダが生成され、sourceコマンドで仮想環境を駆動すると、パス冒頭に(venv)が付与される。この状態で、pipを実装することで、venvフォルダ内に必須コンポーネントがインストールされる。仮想環境下ではなくOS直下にインストールすることでも問題ないが、Djangoアプリが依存しているコンポーネントの管理(見える化)の観点から、venv環境下に格納することがよいと考える。
    続いて、以下のpipコマンドでコンポーネントをインストールする。成功したらpip freezeコマンドでインストール済みコンポーネントを確認する

    (venv) # pip install -r requirements.txt
    (venv) # pip freeze
    certifi==2018.1.18
    chardet==3.0.4
    Django==2.0.2
    idna==2.6
    Pillow==5.0.0
    pytz==2018.3
    requests==2.18.4
    urllib3==1.22    
    以上から分かる通り、Django バージョン 2.0.2も含み必要コンポーネントのインストールが完了した!!


  4. apache2のインストール
    以下のコマンドでWEBサーバーコンポーネント"apache2"をインストールする

    # apt-get install apache2

    成功したら、サーバーのグローバルIPアドレスをブラウザのアドレス欄に入力。Apacheの初期画面が表示されればインストールと起動成功!
    apache初期画面

  5. mod_wsgiのインストール
    続いて、mod_wsgiのインストール。これはPythonで、WEBサーバー(ここではApache2)とWEBアプリを連結する為のモジュールで、DjangoアプリをApache上で駆動させるために必要である。

    # apt-get install libapache2-mod-wsgi-py3
  6. Apache設定の変更("mod_wsgi"との連携)
    Apache上で、mod_wsgiと連携するために設定ファイルを作成する

    # touch /etc/apache2/sites-available/python.conf

    ファイルに以下の情報を記載する。記述方法はdjango公式のここを参照

    LoadModule wsgi_module modules/mod_wsgi.so
    
    WSGIScriptAlias / /home/hoge/git/django_app/app/wsgi.py
    WSGIPythonHome /home/hoge/git/django_app/venv/
    WSGIPythonPath /home/hoge/git/django_app:/home/hoge/git/django_app/venv/lib/python3.6/site-packages
    
    <Directory /home/hoge/git/django_app/app>
    <Files wsgi.py>
    Require all granted
    </Files>
    </Directory>

    "WSGIScriptAlias"の最初の"/"は、ルートURLの設定。/mysiteとすると、http://hogehoge.net/mysite/がルートURLになる。
    "WSGIPythonHome"で、"mode_wsgi"に関連付けるPythonのパスを指定。今回はPython仮想環境を経由したので、そのパスを指定。ちなみにディレクトリを指定する点に注意!!
    "WSGIPythonPath"で、アプリのルートディレクトリ及び仮想環境のライブラリディレクトリを指定。
    下記コマンドで設定を反映させる
    "Directory"で、apacheへアクセス権を与えるディレクトリのパスを指定。Djangoアプリや静的ファイルを格納するディレクトリなどがそれにあたる。

    # a2ensite python.conf
    Enabling site python.
    To activate the new configuration, you need to run:
    systemctl reload apache2

    コメントに従って、apache2の再起動

    # systemctl reload apache2


  7. Django設定(settings.py)の変更
    Djangoアプリの設定ファイルapp/settings.pyを編集して、デプロイに向けた準備をする。
    まず下記通りに編集して、公開サイトのドメイン名を指定する。"*"は全て公開を意味する。制限したい場合、"www.hogehoge.com"などにして、直接指定も可!!

    ALLOWED_HOSTS = ['*']

    次に、"html"のテンプレートファイルを読み込めるように編集する

    EMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # ←ここを編集!
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
    ]
    これで、Djangoアプリ直下のtemplatesディレクトリ内に格納されたHTMLテンプレートファイルが読み込まれる


  8. staticファイルの読込み設定(Django, Apache双方への設定)
    画像ファイルやメディアファイル、CSSやjavascriptファイルなどの静的ファイルをWEBサーバー(Apache)から配信できるように設定を行う。最終的には、manage.py collectstaticコマンドを実行して、Djangoアプリ内で利用・参照するstaticファイルを所定のフォルダSTATIC_ROOTに集め、サーバーはそこをSTATIC_URLとして公開(配信)する形になる。
    下記をapp/settings.pyの最下部に追加した。各自Djangoアプリの構成に従って、修正する必要があるので、以下は一例と捉えてほしい。
    Django公式ドキュメントを一読することで、理解が深まる。今回も参照しながら設定した。

    STATIC_URL = '/statics/'
    STATIC_ROOT = os.path.join(BASE_DIR, "statics/")
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, "static"),
    )

    ポイント
    "collectstatic"コマンド実行時、任意の場所から収集させるためには以下に追記する。例えば、複数のディレクトリからファイルを集める場合には用いられる。今回の場合、プロジェクト直下の"static"ディレクトリ内にまとめて静的ファイルを格納する構成となっているため、この記述となっている。

    STATICFILES_DIRS = (
      # ここに任意のディレクトリを指定する
      # os.path.join(BASE_DIR, "static"),
    )


    更に、WEBサーバー(Apache)側の設定ファイル(/etc/apache2/sites-available/python.conf)にも修正を加える。

    Alias /statics/ /home/hoge/git/django_app/statics/
    
    <Directory /home/hoge/git/django_app/statics>
    Require all granted
    </Directory>

    ここまできたら、WEBサーバーの再起動

    # a2ensite python.conf
    # service apache2 restart

    ポイント
    静的ファイルの格納ディレクトリ(今回はstatics)が、Django側の設定app/settings.pyとapache側の設定/etc/apache2/sites-available/python.confで共通担っていること!!
    ここがずれていると、ブラウザヒョジの時に「staticファイルがないよ!」って、404エラーが吐き出されてしまう

    下記コマンドを実行して、静的ファイルをかき集める!!

    # cd <gitリポジトリのパス>
    # source venv/bin/activate
    (venv) # manage.py collectstatic
    216 static files copied to '/home/hoge/git/django_app/statics'.

    これで、216の静的ファイルがstaticsフォルダ内にかき集められる。

    ポイント
    Djangoアプリに依存したモジュールは、Python仮想環境からインストールしているので、まずはVirtualEnv環境を実行してから、manage.py collectstaticを実行する

  9. ブラウザで動作確認!!
    ここまでくれば、WEBサーバーからの配信準備が整っている。すなわち、既にデプロイされている!!
    なので、VPSのブローバルIPアドレスを適当なブラウザのアドレス欄に入力してほしい!すると…

    『ドン!!!』

    表示されたのではないだろうか!?!?

    もし何か不具合があっても大丈夫!!何か設定を見落としていたり、コンポーネントが不足しているだけだろう。具体的には、画面上にエラーメッセージが表示されていると思うので、それを参照して解決していく。これはローカル開発時にもDjangoがエラーメッセージを出力してくれていたので、その時を思い出しながら、トラブルシュートしていけばいい。
    ちなみに、Django側の問題だけとは限らない。WEBサーバーのエラーの場合、Apacheがエラーログをファイル出力しているので、そちらも確認することで、問題解決の糸口になる。ちなみにエラーログは、以下で確認できる。オプションに-fを付与するとログファイルの変更を検出して出力してくれるので、リアルタイムに監視する時に便利。

    # tail /var/log/apache2/error.log

STEP.5:正式デプロイ!最後の設定変更!!〜最重要〜

前項でブラウザに表示されたら、デプロイ完了!!
と言いたくなるが…最後のダメ押し、そして意外にも最も大事な設定変更を以下から行う。
Django設定ファイルapp/settings中のデバッグモードをOFFにする設定変更である。

DEBUG = False   # True を False に変更

これを行わないと、もしサイトに不備があった場合、その詳細エラーメッセージが誰にでも表示されてしまう。これは一般閲覧者にとって混乱を与えるとともに、セキュリティ上の不安も残す。よって、デバッグモードをOFFにして、再起動することがデプロイ最後の作業に欠かせない。

# service apache2 restart

これでデプロイ完了!!
ただし現時点では、グローバルIPアドレスでアクセスするだけとなるので、次回はDNSサーバーの設定を行なう予定。
そうすることでサーバーを移管してIグローバルIPアドレス変更にともなう問題を気にする必要もなくなるし、SEO対策には当然中の当然の対応になるので…



Debian9 に Python3系をインストールしてみた!

この記事は、
ConoHa VPS の Debian OS に Djangoベースのサービスデプロイしてみた!!の続編。前回は、

  1. ConoHa VPSで サーバー設置
  2. SSH接続の設定

までを行なった。
今回はサーバー環境にPython3系をソースコードからビルドしてインストールまでの手順をまとめた、第二弾。
サービスをPython3.6で実装しているが、Debian9ではPython3.5までしか標準にインストールされていない為、Pythonコミュニティーからソースコードをダウンロードして、ビルド&インストールしてみた。

環境紹介などのおさらいから…



環境

クライアント(手元)のPC

  • MacOSX 10.13.4

サーバー "ConoHa VPS"

  • Debian 9
  • Apache2.4.25(Debian)
  • Python 3.5.3
  • Django 2.0.2
  • pip3 9.0.1

前回のおさらい

STEP.1:ConoHa VPSで、[Debian9]ベースのサーバーを追加
STEP.2:サーバーの初期設定

上記に関してはここを参照

STEP.3:Python3.6のビルド&インストール

    [商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

    将棋AIで学ぶディープラーニング [ 山岡忠夫 ]
    価格:3434円(税込、送料無料) (2018/4/12時点)

  1. Python3 のインストール(or バージョン確認)
    今回のサービスは、Python3.6ベースで開発されてるので、開発環境と互換性を持たせるためにサーバー標準のPythonのバージョンを確認することから始め、必要に応じてバージョンアップもしくは新たにインストールすることとする。

    # 搭載Pythonのバージョン確認
    #python -V
    Python 2.7.13
    #python3 -V
    Python 3.5.3
    この結果、Python3系はバージョン"3.5.3"であることがわかった。
    調べたところ、Debian9のPython3の標準搭載バージョンが3.5系とのことなので、バージョンアップすることとする。
    1. 必要パッケージのインストール

      apt install -y zlib1g-dev libssl-dev libreadline-dev  libsqlite3-dev libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev tk-dev zlibc
      他にも必要なパッケージはあるが、ビルド時にメッセージが表示されるためとりあえずはこれで十分
    2. アーカイブ(ソースコード)のダウンロード
      ここから最新もしくは指定の安定バージョンをダウンロードする。ソースコードのダウンロードパスは右クリックで、"リンクのコピー"で取得可能

      # cd /usr/local/src
      # wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
      # tar xzvf Python-3.6.5.tgz


    3. ビルド&インストール
      以下のコマンドを順に実行してインストールする。

      # cd Python-3.6.5
      # ./configure
      # make
      # make altinstall
      <ポイント>
      1. インストール先を指定する場合、./configureのオプションに--prefixを使用
        例:./configure --prefix=/usr/local/python-3.6
      2. ---enabled-sharedオプションは使用しない!!メリットがないから(具体的な理由は不明)
      3. make altinstallを使用する!!(※make installだけだと、既存のpython3の依存関係を壊す可能性がある為)
        インストール後の確認
      # find / -name "python3*" # ルートパス"/"以降で、"python3"をファイル名に含む一覧を検索
      # 以降が表示されていればインストール完了(他にもたくさん表示される)
      /usr/local/bin/python3.6m-config
      /usr/local/bin/python3.6m
      /usr/local/bin/python3.6

      バージョン確認が表示されれば、正常にインストールされている

      # python3.6 -V
      Python 3.6.5


    4. 環境変数(PATH)の設定
      前述の./configure--prefix指定した場合、インストール先のパスが通っていない可能性がある為、その場合はPATH登録をすること

      # PATH=<Prefixで指定したパス>/bin:$PATH
      # export PATH
      # source /etc/profile
    5. pipの更新 (or バージョン確認)

      # pip3.6 install --upgrade
      You must give at least one requirement to install (see "pip help install")
    6. pip.confの生成

      # pip list
      DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
      pip (9.0.3)
      setuptools (39.0.1)
      

      上記の警告が出るので、/etc/pip.confファイルに以下を追加

      [list]
      format=columns

      再度実行すると

      # pip3.6 list
      Package    Version
      ---------- -------
      pip        9.0.3  
      setuptools 39.0.1 
      成功!!
    7. 確認
      以下のコマンドで、Python本体とpipのバージョンを確認。正常に表示されれば完了!!

      # python3.6 -V
      Python 3.6.5
      # pip3.6 -V
      pip 9.0.3 from /usr/local/lib/python3.6/site-packages (python 3.6)

    参考にしたサイトは ここ

長くなってしまったので、今回はここまで!!
次回は、【STEP.4】Apache2, git, Djangoのインストールから設定までを行う予定。



↑このページのトップヘ