ヌートリ日記

開発というより環境構築系のブログ

Python Hello world!

この記事の内容

uwsgi使ってPythonアプリケーションサーバを構築する

pipenvを使っているぐらいで他に変わったことは特になし

開発環境

macOS High Sierra 10.13.6

Pythonのバージョン固定

$ echo '3.7.0' > .python-version

パッケージ管理ツールの導入

$ pipenv install
$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.7"

uwsgiとlogger追加

$ pipenv install uwsgi logger

uwsgi setup

$ vim uwsgi.ini
[uwsgi]
master = True
socket = 127.0.0.1:3031
wsgi-file = index.py
stats = 127.0.0.1:9191
logto = uwsgi.log
pidfile = uwsgi.pid

$ touch uwsgi.log

uwsgi code

$ vim index.py
# coding:utf-8

import logging

handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)

def main():
    logger.info('Hello world!')

def application(env, start_response):
    main()
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World!"

uwsgi start

$ pipenv shell
Launching subshell in virtual environment…
. /path/to/virtualenvs/app-xxxxxxxx/bin/activate
(app-xxxxxxxx) $ uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini

動作確認

$ curl localhost:3031
$ cat uwsgi.log
.
.
.
2018-07-19 13:41:17,632 - root - INFO - Hello world!
[pid: 330|app: 0|req: 1/1] 127.0.0.1 () {28 vars in 293 bytes} [Thu Jul 19 13:41:17 2018] GET / => generated 0 bytes in 1 msecs (HTTP/1.1 200) 1 headers in 44 bytes (12 switches on core 0)

AWSでセキュリティ向上、設定の見直し その1

rootにパスワードをつける

とりあえずrootにパスワードはつけておきたい。

sudo su -
passwd

yum のアップデート

サーバーにsshでアクセスする際のメッセージをよく見る

https://aws.amazon.com/amazon-linux-ami/2012.09-release-notes/
There are 3 security update(s) out of 43 total update(s) available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-***-***-***-*** ~]$

「sudo yum update」をしろと言われているのでアップデート

sudo yum update

sshのport変更

sshのportを変更しておくことでセキュリティ強化

vim /etc/ssh/sshd_config

sshd_config
Port 22 → Port [好きなPort番号]

/etc/rc.d/init.d/sshd restart // 反映

AWSのSecurityGroupsの変更を忘れないこと。

FTPSのportも変更

この辺りを修正

vim /etc/vsftpd/vsftpd.conf

pasv_min_port
pasv_max_port
listen_port

service vsftpd restart // 反映を忘れないこと

こちらもSecurityGroupsの変更をする。

OS起動時にサービス開始

chkconfig httpd on
chkconfig vsftpd on
chkconfig mysqld on

などなど

AWSで独自ドメインの設定

AWSで独自ドメインの設定

独自ドメインの取得

各自ドメインの取得方法は違うと思いますので省略します。
お名前.com : (http://www.onamae.com/)
ムームードメイン : (http://muumuu-domain.com/)

IPの取得

EC2では固定IPを取得しなければ、独自ドメインを載せることはできません。
(正確には可能だが、固定IPを取った方が無難)
EC2のメニューの中の「Elastic IPs」を選択してください。
f:id:iwanomoto:20130116182227p:plain

Allocate New Addressをクリックし、EC2が選択されているのを確認し、「YES」をクリックする。
こちらで固定IPの取得は完了です。

固定IPの料金

http://aws.amazon.com/jp/ec2/pricing/
$0.00 : 実行中のインスタンスと関連付けられている Elastic IP アドレス
$0.005 : 実行中のインスタンスと関連付けられている追加の Elastic IP アドレス/時間当たり(プロラタベース)
$0.005 : 実行中のインスタンスと関連付けられていない Elastic IP アドレス/時間当たり(プロラタベース)
$0.00 : Elastic IP アドレスのリマップ 1 回当たり - 1 か月間で 100 リマップまで
$0.10 : Elastic IP アドレスのリマップ 1 回当たり - 1 か月間で 100 リマップを超える追加分

こちらは複雑なことが書かれてますがシンプルに難しく考える必要はありません。
IP一つにつき、1時間あたり$0.005
最初の一つはインスタンスと関連付けすれば無料で使えます。
インスタンスに関連付けや変更を行うことをリマップといい、100回以上を行うと1回あたり$0.1発生します。

IPとインスタンスを関連付ける

IPを選択した状態で「Associate Address」をクリックしてください。
インスタンスの一覧から使用したいインスタンスを選択すれば完了です。

IPの設定の動作確認

Apacheのインストールが完了している場合はブラウザで先ほど取得したIPアドレスにアクセスしてください。
Ping確認する場合はSecurityGroupsに変更が必要です。
ICMPを開放してからPingを叩いてみてください。

ドメインとIPを関連付ける

各自ドメインの取得方法は違うので共通の変更箇所だけ記載します。

http.confの編集

ServerName ドメイン名

DNSレコードの変更

例としてお名前.comの設定方法を記載します。

ドメインの設定 → レンタルDNSレコード設定 → ドメインを選択

ホスト名、TYPE、VALUE の3つを編集します。
ホスト名 : アクセスしたいドメイン
TYPE : Aを選択
VALUE : 取得したIPを設定

こちらを反映すると最大48時間以内にドメインが反映されます。

FTPSの環境構築

今回は通常のFTPのインストールとセキュリティを強化したFTPSの環境構築を行います。

FTPSとは?

http://e-words.jp/w/FTPS.html

クリアテキストでアップロードした際に通信傍受されても大丈夫なように、暗号化をする技術です。
また、同じような通信方式としてSFTPもありますが、今回はFTPSの紹介をします。

vsftpdのインストール

yum install vsftpd

設定ファイルを編集

vim /etc/vsftpd/vsftpd.conf

編集(上から下に変更)
anonymous_enable=YES
anonymous_enable=NO

dirmessage_enable=YES
dirmessage_enable=NO

#ascii_upload_enable=YES
ascii_upload_enable=YES

#ascii_download_enable=YES
ascii_download_enable=YES

#chroot_local_user=YES
chroot_local_user=YES

#chroot_list_enable=YES
chroot_list_enable=YES

tcp_wrappers=YES
tcp_wrappers=NO

connect_from_port_20=YES
connect_from_port_20=NO

xferlog_std_format=YES
xferlog_std_format=NO

追加
pasv_enable=YES // 追加
pasv_addr_resolve=YES // 追加
pasv_address=接続先 // 追加
pasv_min_port=必ず変更 // 追加
pasv_max_port=必ず変更 // 追加
use_localtime=YES // 追加
force_dot_files=YES // 追加
listen_port=必ず変更 // 追加

FTPS用の設定(追加)
ssl_enable=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
force_local_logins_ssl=YES
force_local_data_ssl=YES
allow_anon_ssl=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

anonymous_enable
匿名ユーザーのログインは許可しない
dirmessage_enable
ユーザが新しいディレクトリに初めて移動したとしてもメッセージは表示しない。

ascii_upload_enable
アスキーモードのアップロードを有効にする。

ascii_download_enable
アスキーモードのダウンロードを有効にする。

chroot_local_user
ローカルユーザーのルートを各自のホームに変更する。

chroot_list_enable
chroot_listを有効にする。ファイルはデフォルト(chroot_list_file=/etc/vsftpd/chroot_list)になる。

tcp_wrappers
ホストへのアクセスを制御しない。(EC2のSecurity Groupsで指定したほうが設定しやすい)

connect_from_port
ActiveFTPを無効にする。

xferlog_std_format
wu-ftpdではなく、vsftpdログ形式でログを記録する。

pasv_enable
PASV FTPを有効にする。

pasv_addr_resolve
PASVモード接続先IPアドレスをホスト名から取得する。

pasv_address
接続先サーバを設定する

pasv_min_port
PASVモード接続時の最小ポート番号。(確認した空きポートの範囲で設定)

pasv_max_port
PASVモード接続時の最大ポート番号。(確認した空きポートの範囲で設定)

use_localtime
ローカルタイムを使用(デフォルトはGMT)

force_dot_files
.(ドット)で始まるファイルを隠さない。

listen_port
ポート送信番号の変更

ssl_enable=YES
SSLの有効化

鍵の場所
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem

通常のFTP接続を不可にする
force_local_logins_ssl=YES

通常のFTP接続を不可にする
force_local_data_ssl=YES

匿名アクセス時の通信では SSL を利用しない
allow_anon_ssl=NO

SSLセッションを再利用しない
require_ssl_reuse=NO

DES-CBC3-SHA対応していないクライアント用に追加(fileZillaなど)
ssl_ciphers=HIGH

FTP上での閲覧権限の変更(rootディレクトリまで見れるユーザ一覧)

今回は誰も見れないようにそのまま保存します。

vim /etc/vsftpd/chroot_list
:wq

FTP専用アカウントの作成

(例) 今回は事前にftpというグループを作成しております。

useradd -s /sbin/nologin -g ftp -M [ユーザー名]
passwd [ユーザー名]
usermod -d /var/www/html [ユーザー名]

FTPS用のキーを作成

makeがない場合

yum install make

鍵の作成

cd /etc/pki/tls/certs/			
make vsftpd.pem

Country Name (2 letter code) 国名
State or Province Name (full name) 県名
Locality Name (eg, city) 市町村
Organization Name (eg, company) 会社名
Organizational Unit Name 組織名
Common Name サーバ名
Email Address 連絡先メールアドレス

最後にAWSのSecurityGroupにvsftpd.confで設定したPortを開放してください。

また、FTPクライアントにより接続方法は変わると思いますので、省略させていただきます。
設定に関しては一例ですので各自意味を理解し、見直しをお願いします。

AWSでLAMP環境の構築

Apacheは前回の記事にてインストール完了していると思いますので省略します。
EC2の立ち上げとWebサーバ公開まで

Mysql

  • Mysqlのインストール
yum install mysql-server

Complete!と最後に出ていれば成功です。

  • EC2のインスタンス別におすすめの設定があるのでコピーする 設定ファイルの検索
[root@ip-***-***-***-*** ~]# find / -name my-*.cnf
/usr/share/doc/mysql55-server-5.5.28/my-small.cnf
/usr/share/doc/mysql55-server-5.5.28/my-medium.cnf
/usr/share/doc/mysql55-server-5.5.28/my-innodb-heavy-4G.cnf
/usr/share/doc/mysql55-server-5.5.28/my-huge.cnf
/usr/share/doc/mysql55-server-5.5.28/my-large.cnf
/usr/share/mysql/my-small.cnf
/usr/share/mysql/my-medium.cnf
/usr/share/mysql/my-innodb-heavy-4G.cnf
/usr/share/mysql/my-huge.cnf
/usr/share/mysql/my-large.cnf

設定をコピーする

cp /usr/share/mysql/my-[インスタンス規模].cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'?

既に/etc/my.cnfは存在するため、上書きしてもよろしいですか?という質問ですので「yes」

  • MySQL データを初期化し、システム テーブルを作成
mysql_install_db
  • mysqlの所有権を変更
chown -R mysql:mysql /var/lib/mysql
  • my.cnfの設定
[mysqld]
character-set-server = utf8
skip-character-set-client-handshake

[mysql]
default-character-set = binary

[mysqldump]
character-set-server = binary
  • mysqlに設定を反映させるためにrestart
service mysqld restart
  • OS再起動時に自動起動
chkconfig mysqld on
  • rootのパスワード変更
/usr/bin/mysqladmin -u root password 'パスワード'
  • 接続の確認
mysql -u root -p
Enter password: [パスワードを入力してください]

PHP

  • PHPを扱う際にあると便利なものも一緒にインストールしておく。
yum -y install php php-pear php-mysql php-mbstring php-gd php-mcrypt php-pecl-apc
  • php.iniの編集
date.timezone="Asia/Tokyo" // タイムゾーンの設定
expose_php = Off // PHPのバージョンを隠す
error_reporting = E_ALL & ~E_NOTICE | E_STRICT //PHP5で推奨されていない関数にエラーを出す
log_errors = On // ログを取得
log_errors_max_len = 1024 // ログのMAXサイズを指定する
display_errors = On // エラーを画面上に表示する(開発段階ではON)
default_charset = "UTF-8" // デフォルトの文字コード指定
allow_url_fopen = Off // URIをファイルとして扱わない(どこからでもコードが読み込める可能性がある)
mbstring.language = Japanese // 環境を日本語に変更
mbstring.internal_encoding = UTF-8 // 内部文字コードの指定

EC2の立ち上げとWebサーバ公開まで

EC2とは?

Amazon Elastic Compute Cloud(Amazon EC2)とは、クラウド内で規模の変更が可能なコンピュータ処理能力を提供するウェブサービスです。
そして、ウェブスケールな処理能力を開発者が簡単に利用できるよう設計されています。

簡単に説明

今までのレンタルサーバでは移行する場合新しくサーバを借りて現在のデータを移行先に移動する必要がありました。 Amazon Elastic Compute Cloud(以降、EC2と省略)では数クリック程度でサーバの移行が可能です。

気になる料金

サーバをどこに置くか選べるため、場所ごとに若干価格は違う。
東京であれば一番安い物で、マイクロ 「1時間あたり$0.027」

24(時間) * 30(日) * 0.027($) * 90(円) = 1749.6(円) + α(トラフィック) (2013年1月10日現在)

トラフィック
データ転送受信 0円

データ転送送信
最初の1GB/月 $0.000 GB あたり
10 TBまで/月 $0.201 GB あたり
次の 40 TB/月 $0.158 GB あたり
次の 100 TB/月 $0.137 GB あたり
次の 350 TB/月 $0.127 GB あたり
次の524 TB/月 お問い合わせ
次の 4 PB/月

トラフィック量とは

データ転送受信
ユーザーがサーバに画像をアップロードした。
外部サイトからデータを持ってきた。

データ転送送信
ユーザーがサイトを見た
ユーザーが画像を見た

つまり、ユーザーが1Mある画像に2000回アクセスした場合
0.201($) * 2(G) * 90(円) = 36.18(円) の料金が発生します。

今回ポイントとなるキーワード

インスタンス
Key Pair
Security Group

インスタンス : サーバ本体
Key Pair : インスタンスに接続するのに必要なもの
Security Group : インスタンスに接続可能なPortを設定するもの

EC2のインスタンスを立ち上げる

  • 右上のリージョン(サーバの置いてある場所)がTokyoになっているか確認
  • 左側のメニューからInstancesを選択
  • Launch Instance → Classic Wizardを選択し次へ進む
  • 今回はAmazonが用意しているデフォルトの「Amazon Linux AMI 2012.09」の64bitを使用します。

  • 特に変更をする必要はありませんが重要な点だけ説明しておきます。
    Instance Type : サーバのスペック、EC2の料金体型
    Availability Zone : 日本国内のサーバの場所

  • 特に変更する必要はない

  • 管理しやすいように名前をつける

  • Key Pairの作成、名前は立ち上げるサーバに関連するものにした方が良い(このファイルは紛失すると再発行ができないのでしっかりと管理する)

  • Security Groupの作成、こちらもサーバに関連するものにした方が良い
    とりあえず今回は名前だけつけて次に進む

  • 完了、サーバが立ち上がるまで2,3分かかります。
  • 左側のメニューよりInstancesを選択すると、先ほどまでなかったインスタンスが立ち上がっています。

サーバに接続する

筆者の環境 : MacOSX 10.6.8

  • まず接続先の情報を取得します。 先ほどAWSの管理画面より、インスタンスが立ち上がったのを確認したと思いますが、そちらをクリックしてください。
    このような文字列が画面下の方に現れると思います。
ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com

こちらが接続先です。

  • 次に接続するためのキーを少し修正します。
    先ほどダウンロードしたKey Pairを使用します。(.pemファイル)
    Key Pairのパーミッションを変更します。
    ターミナルを開いて
    chmod 600 [Key Pairの場所]

  • SSHで接続するためにPortの22番を開放する
    左側のメニューから「Security Groups」を選択
    先ほど作ったSecurity Groupをクリック
    下部にInboundというタブが出てくるのでそちらをクリック
    Create a new rule: Custom TCP rule (通信方式)
    Port range : 22 (ポート番号)
    Source: 0.0.0.0/0 (接続を許可するIP)
    Add Ruleをクリックし、右側に画像のように追加されたのを確認する
    Apply Rule Changesをクリックし、反映させる(忘れがち)

  • 接続 ターミナル上で以下のコマンドを入力してください
    ssh -i [Key Pairの場所] ec2-user@[接続先]
    (例) ssh -i key_pair/test.pem ec2-user@ec2----.ap-northeast-1.compute.amazonaws.com
    Are you sure you want to continue connecting (yes/no)? と聞かれた場合は「yes」

  • エラー例

  • 何も反応しない
    Security Groupの設定が間違っている

  • WARNING: UNPROTECTED PRIVATE KEY FILE!
    Key Pairのパーミッションの変更ができていない

  • Permission denied (publickey).
    Key Pairを選択できてない

  • 接続成功した場合
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2012.09-release-notes/
There are 3 security update(s) out of 43 total update(s) available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-***-***-***-*** ~]$

ブラウザでサーバにアクセスできるようにする

sudo yum -y install httpd (Apacheのインストール)
sudo service httpd start (Apacheの起動)
先ほど22番を開けたSecurity Groupと同じように80番も開ける(ブラウザでアクセスする場合デフォルトでは80番になる)
ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com にブラウザでアクセス

以下のようなページが表示されれば無事完了です。
お疲れ様でした。

関連記事

AWSのアカウント取得

AWSとは?(Amazon Web Services)

http://aws.amazon.com/jp/

クラウドプラットフォーム環境を提供するアマゾン ウェブ サービス(AWS)は、用途にあわせて自由に選択できるクラウドサービスです。
信頼性の高い、柔軟かつ低価格なクラウドコンピューティング環境をご利用分だけのお支払いでご利用いただけます。

つまりどういうこと?

従来のレンタルサーバより色々便利になった程度の認識で現状とりあえずOKです。

料金がよくわからない

従量課金制なので、使った分料金が発生します。
ただ、固定費も発生するのでアクセスがないから大丈夫というわけではありません。
まず使うであろうEC2の料金体型

必要な物

  • メールアドレス
  • クレジットカード
  • 電話番号

申し込みページ

http://aws.amazon.com/jp/

f:id:iwanomoto:20130110182947p:plain

右側にある「今すぐ申し込む」からアカウント取得してください。

※ 申込時Amazonより登録した番号に電話がかかってくるため、必ず電話に出れる環境で登録してください。

関連記事