Python Hello world!
この記事の内容
uwsgi使ってPythonのアプリケーションサーバを構築する
pipenvを使っているぐらいで他に変わったことは特になし
開発環境
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」を選択してください。
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発生します。
FTPSの環境構築
今回は通常のFTPのインストールとセキュリティを強化したFTPSの環境構築を行います。
FTPSとは?
クリアテキストでアップロードした際に通信傍受されても大丈夫なように、暗号化をする技術です。
また、同じような通信方式として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
ポート送信番号の変更
鍵の場所
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専用アカウントの作成
(例) 今回は事前に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)
クラウドプラットフォーム環境を提供するアマゾン ウェブ サービス(AWS)は、用途にあわせて自由に選択できるクラウドサービスです。
信頼性の高い、柔軟かつ低価格なクラウドコンピューティング環境をご利用分だけのお支払いでご利用いただけます。
つまりどういうこと?
従来のレンタルサーバより色々便利になった程度の認識で現状とりあえずOKです。
料金がよくわからない
従量課金制なので、使った分料金が発生します。
ただ、固定費も発生するのでアクセスがないから大丈夫というわけではありません。
まず使うであろうEC2の料金体型
必要な物
- メールアドレス
- クレジットカード
- 電話番号
申し込みページ
右側にある「今すぐ申し込む」からアカウント取得してください。
※ 申込時Amazonより登録した番号に電話がかかってくるため、必ず電話に出れる環境で登録してください。