Quantcast
Channel: 空想ブログ
Viewing all 167 articles
Browse latest View live

nginx + php-fpmでCentOS7でPHP7を最低限動かす

$
0
0

nginx1.11とPHP7.0-FPMを連携して動かす。

CentOS7にyumでnginx1.11をインストール

CentOS7にyumでPHP7, PHP-FPM, OPcache, APCuをインストール

とりあえずPHPを動かす

nginx1.11のデフォルトの設定では、「/usr/share/nginx/html」が公開ディレクトリ。
ここにphpファイルを置いて、アクセスできるようにする。

sudo vim /usr/share/nginx/html/index.php

<?php
echo phpinfo();

nginxの設定を修正。

sudo vim /etc/nginx/conf.d/default.conf

下記箇所のコメントアウトを全て削除。
rootディレクトリとfastcgi_paramを修正する。

location ~ \.php$ {
 #root html;
 root /usr/share/nginx/html;
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
 fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
 include fastcgi_params;
 }

php-fpm側の修正。

sudo vim /etc/php-fpm.d/www.conf

こっちはuserとgroupをapacheからnginxへ修正するだけでいい。

;user = apache
user = nginx
;group = apache
group = nginx

再起動する。

sudo systemctl restart nginx
sudo systemctl restart php-fpm

IPアドレス直指定して、作成したPHPファイルにアクセスできれば連携はできるようになっている。

http://xxx.xxx.xxx.xxx/index.php

astCGI sent in stderr: “Primary script unknown” while reading response header from upstream

下記のように、rootをコメントアウトしただけだとエラーが出るぞ。

location ~ \.php$ {
#root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}

参考

nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する

nginx+php-fpm


CentOS7にMySQL5.7をyumでインストール

$
0
0

CentOS7にMySQL5.7をインストールする。

CentOS7からはMariaDBがデフォルトではいっているが、使い慣れたMySQLをつかっていくことにした。

インストール

下記コマンドでインストールまでいける。

wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

sudo yum localinstall mysql57-community-release-el7-7.noarch.rpm

sudo yum install mysql-community-server

自動起動をonに

sudo systemctl enable mysqld

MySQL起動

sudo systemctl start mysqld

バージョン確認、5.7.13やった。

mysqld -V

パスワード・セキュリティ設定

rootアカウントの初期パスワードが「/var/log/mysqld.log」に記入されているので確認する。

sudo grep 'temporary password' /var/log/mysqld.log

最低限のセキュリティ設定を行う。

sudo mysql_secure_installation

対話形式で色々聞かれる。

#最初にrootパスワードが聞かれるので、先ほどのパスワードを入力。
Enter password for user root:

# rootパスワードを変更するか聞かれる、変更しとこう。
Change the password for root ? ((Press y|Y for Yes, any other key for No) :

# 匿名ユーザを削除するか聞かれる、削除しとこう。
Remove anonymous users? (Press y|Y for Yes, any other key for No) :

# リモートからのrootでのログインを禁止するか聞かれる、禁止しよう。
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :

# testデータベースを削除するか聞かれる、削除しよう。
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :

# 権限テーブルを再読込するか、再読込しとこう。
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

文字コードをUTF-8に、パスワードの有効期限をナシにしとく。

sudo vim /etc/my.cnf

[myslqd]
character-set-server = utf8
default_password_lifetime = 0

MySQL再起動。

sudo systemctl restart mysqld

参考

CentOS7にMySQL5.7をYumでインストールする方法

mysql_secure_installation の中身を追ってみた

MySQL 5.7 をインストールしたら最初に行うセットアップ

CentOS7 + nginx + php7-fpm + UNIXドメインソケットでPHP動かす

$
0
0

CentOS7, nginx1.11, php7-fpm, UNIXドメインソケットの構成でPHP動かす。

以下4つの設定はやっておく。

さくらVPSにCentOS7をインストールしたときにやる設定

CentOS7にyumでnginx1.11をインストール

CentOS7にyumでPHP7, PHP-FPM, OPcache, APCuをインストール

nginx + php-fpmでCentOS7でPHP7を最低限動かす

Unixドメインソケット(UNIX domain socket )

ソケットというのが、実行中のプロセス間でデータの送受信を行う(プロセス間通信)ための仕組み。

UNIXドメインソケットというのが、同じコンピュータ上で実行中のプロセス間通信を行うためのもの。

別のコンピュータで実行中のプロセスとデータ通信を行うものを、TCP/IPネットワークを使うため、TCPソケットという。

nginx + php-fpmのデフォルト設定ではTCPソケットが使われているが、同一サーバ内でプロセス間通信するのでUnixドメインソケットに切り替える。

設定

nginxの設定を変更。

sudo vim /etc/nginx/conf.d/default.conf

location ~ \.php$ {
    root /usr/share/nginx/html;
    #fastcgi_pass &lt;span class="x x-first x-last"&gt; 127.0.0.1:9000&lt;/span&gt;;   
    fastcgi_pass unix:/run/php-fpm/php7.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include fastcgi_params;
}

php-fpmの設定を変更する。

sudo vim /etc/php-fpm.d/www.conf

# TCPソケットからUNIXドメインソケットへ変更
;listen = 127.0.0.1:9000
listen = /run/php-fpm/php7.sock

# これないとエラー出ます
listen.owner = nginx
listen.group = nginx

nginxとphp-fpmを再起動。

sudo systemctl restart nginx

sudo systemctl restart php-fpm

参考

nginx + PHP7.0 / php-fpm Socket 接続に変更

nginx + php-fpm socketで接続する

nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する

調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話

CentOS7, nginx1.11, php7-fpm, MySQL5.7でWordPress動かす

$
0
0

さくらVPS上のCentOS7で、nginx, php7, php-fpm, MySQL5.7, UNIXドメインソケットでWordePressを動かす。

ドメインはしておらず、IPからアクセスする。

以下5つは済ませておく。

さくらVPSにCentOS7をインストールしたときにやる設定

CentOS7にyumでnginx1.11をインストール

CentOS7にyumでPHP7, PHP-FPM, OPcache, APCuをインストール

nginx + php-fpmでCentOS7でPHP7を最低限動かす

CentOS7 + nginx + php7-fpm + UNIXドメインソケットでPHP動かす

WordPressをインストール・設定

最初にWordPressをインストールしてしまい、イメージを掴む。

インストールする場所は自由、本家サイトからダウンロード。

cd /usr/share/nginx/

sudo wget https://ja.wordpress.org/latest-ja.tar.gz

sudo tar zxfv latest-ja.tar.gz

wordpressディレクトリが作成されているので、所有者をnginxユーザに変更。

sudo chown -R nginx:nginx wordpress

WordPressのDB設定する、念のため元ファイルはコピーしておく。

cd wordpress

sudo cp wp-config-sample.php wp-config.php

設定ファイルを修正する。

sudo vim wp-config.php

/** WordPress のためのデータベース名 */
define('DB_NAME', 'test_wordpress');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'root');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password_here');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8');

まとめると、

公開ディレクトリは「/usr/share/nginx/wordpress」
DBは「/usr/share/nginx/wordpress/wp-config.php」で設定したものになる。

これをnginxとMySQLに設定していく。

nginxの設定

rootディレクティブは、wordpressディレクトリを配置したところを指定する。

server {
    listen 80;
    server_name localhost;

    root /usr/share/nginx/wordpress;
    index index.php;

    # wordpress パーマネントリンク設定
    try_files $uri $uri/ /index.php?q=$uri&$args;

    # wp-config.phpへのアクセス拒否設定
    location ~* /wp-config.php {
        deny all;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php-fpm/php7.sock;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }
}

設定ファイルの構文をチェックする。

sudo nginx -t

問題なければnginx再起動。

sudo systemctl restart nginx

mysqlの設定

ログインする。

mysql -u root -p

WordPress用のデータベース作成。

mysql> create database test_wordpress;

今回はrootユーザを設定したけど、WordPress用のユーザを設定した場合はここでそのユーザを作成しておこう。
別のサイトでググってくれ。

WordPressにアクセス

初回設定画面には、IPからでもアクセスできる。

http://xxx.xxx.xxx.xxx/wp-admin/install.php

設定が終わると、ログイン出来るようになる。

http://xxx.xxx.xxx.xxx/wp-login.php

普通にIPからもトップページを確認できる。

http://xxx.xxx.xxx.xxx/

ドメインとかとってる場合は、nginxとかに設定が必要。

参考

CentOS7 + php7 + nginx + php-fpm環境にwordpressインストール

CentOS7 に Nginx をインストールする

Nginx + PHP-FPM で WordPress を動かす

WordPressをLet's Encryptで常時SSL(HTTPS)化する

$
0
0

CentOS7、nginx1.11上のWordPressサイトをSSL化する、そしてHTTP2を使う。

ちなみにHTTPS通信用の証明書作成のためには、対象サーバにドメイン名でアクセスできる必要がある。IPに対する証明書作成はできない仕組みとのこと。

なので、前回の記事でWordPressを作った後、ドメインを取得して、ドメインからアクセスできるようにしておく。

CentOS7, nginx1.11, php7-fpm, MySQL5.7でWordPress動かす

概要

常時SSL(HTTPS)化について

常時SSL化の目的は4つ、ざっくり整理すると

  • セキュリティ:公衆無線LANからの接続においてクッキーの盗聴リスクを防ぐ
  • HTTP/2対応:現在はSSLの場合のみHTTP/2が使用可能、ただしChromeはOpenSSL1.0.2以降が必要
  • SEO:HTTPSサイトは有利、らしい
  • リファラ解析:流入元がHTTPSサイトの場合、HTTPサイトだとキーワードをリファラヘッダーから取得できなかった

SSL化するに当たり、サーバ証明書はLet’s Encryptのものを使用する。

Let’s Encryptとは

Let’s Encryptとは、無償で証明書が利用可能な認証局。

SSLサーバ証明書は、認証レベルの違いにより次の3種類ある。Let’s Encryptが扱うサーバ証明書はDVのみ。

  • Domain Validation (以下、DV):ドメインについてのみ認証、鍵マークが表示される
  • Organization Validation (以下、OV):ドメインに加えサーバを運営する組織の存在を認証、鍵マークのみ表示
  • Extended Validation (以下、EV):OVよりもさらに厳密に組織の存在を認証、鍵マークに加えず緑色のバーがURL部分に表示される

Let’s Encryptが証明書だと勘違いしてたぜ・・・

CentOS7のfirewalld設定

証明書設置する前にfirewalldにhttps通信を許可しておく。

sudo firewall-cmd –add-service=https –permanent

sudo firewall-cmd –reload

httpsが開いていることを確認。

sudo firewall-cmd –list-services –zone=public  –permanent

Let’s Encrypt証明書設置

Let’s Encryptが提供している「certbot-auto」というツールを利用して証明書を取得する。

まずはcertbot-autoをセットアップする。

sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto

sudo chmod 700 /usr/bin/certbot-auto

これでcertbot-autoコマンドが使えるので、証明書を生成する。
-w:ドキュメントルートのパス
-d:認証するドメイン名
–email:メアド、証明書期限切れの通知用

sudo certbot-auto certonly –webroot -w /var/www/runble1wp -d runble1.com –email xxxxx@gmail.com

コマンド実行後に、利用規約がGUIで表示されるので「Agree」にカーソルが合ってることを確認してエンターキーを押す。

処理が終われば、証明書に関連したファイルが/etc/letsencrypt以下にできている。
確認しておこう。

sudo ls -la /etc/letsencrypt/live/runble1.com

サーバ証明書:cert.pem
中間証明書:chain.pem
サーバ証明書と中間証明書を結合したファイル:fullchain.pem
秘密鍵:privkey.pem

nginxの設定

sudo vim /etc/nginx/conf.d/default.conf

上のserverコンテキストでは、http通信を全てhttpsへリダイレクトする処理を書いている。

下のserverコンテキストでは、https・http2で通信する設定をかいてる。

server {
    # httpでのアクセスを全てhttpsへリダイレクト
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name runble1.com;
    return 301 https://runble1.com$request_uri;
}
server {
    listen 443 ssl http2;
    server_name runble1.com;

    ssl_certificate /etc/letsencrypt/live/runble1.com/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/runble1.com/privkey.pem;

    # 以下略

この時点で、runble1.comのサイトはhttps通信ができるようになっている(http通信するとリダイレクトされるようになっている)。

WordPressの設定

設定→一般でWordPressアドレスとサイトアドレスをhttpsにする。

もし、URLバーに鍵マークが表示されず緑色にならない場合、古いテーマが悪さしてる可能性がある。
Stinger3ではHTTPコンテンツが混在していたのか、鍵マークが表示されなかった・・・

Stinger Plus+に変更したら鍵マークが表示されるようになった。

ssl labsで確認すると「B」だった。次回への課題だな・・・

参考

無償SSLサーバー証明書Let’s Encryptの普及とHTTP/2および常時SSL化

Let’s EncryptのSSL証明書で、安全なウェブサイトを公開

Webサイトを「HTTP」から「HTTPS」へ切り替える際に行う一連の作業をまとめました

Copyright © 2016 空想ブログ All Rights Reserved.

WordPressのHTTPSサイトをA+評価にする

$
0
0

SSL Labsでこのブログを診断してもらったところ「B」評価だったので、最高評価のA+を目指して修正する。

またHTTPS通信の高速化も目指して修正する。

SSL/TLSについては、IPAからガイドラインが出てるので、読んどくといい。

概要

nginxでの設定

わかりやすくするため、SSL専用のconfファイルを作る。

sudo vim /etc/nginx/conf.d/ssl.conf

SSL設定が下記。細かな説明は記事の下らへんに。

# SSLセッションキャッシュを全てのワーカープロセスで共有
ssl_session_cache shared:SSL:30m;
ssl_session_timeout 30m;

# 2048ビット以上で作ったDH交換鍵を指定
ssl_dhparam /etc/ssl/private/dhparam.pem;

# OCSP Staplingを有効にする
ssl_stapling on;
ssl_stapling_verify on;
# ルートCA証明書と中間証明書結合した証明書を指定
<pre>ssl_trusted_certificate /etc/letsencrypt/live/runble1.com/fullchain.pem;

# サーバが示した暗号スイートの優先
ssl_prefer_server_ciphers on;

ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

 

Diffie-Hellman鍵を作成する。

sudo mkdir /etc/ssl/private

sudo openssl dhparam -out /etc/ssl/private/dhparam.pem 2048

 

バーチャルホスト側の修正をする。

sudo vim /etc/nginx/conf.d/runble1.com.conf

証明書の変更と、HSTSヘッダーを追加した。

server {
    listen 443 ssl http2;
    server_name runble1.com;

    #ssl_certificate /etc/letsencrypt/live/runble1.com/cert.pem;
    ssl_certificate /etc/letsencrypt/live/runble1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/runble1.com/privkey.pem;

    # HSTS対応
    add_header Strict-Transport-Security "max-age=31536000" always;

構文を確認しておく。

sudo nginx -t

問題なければ再起動。

sudo systemctl restart nginx

再度SSL Labsで評価してもらうとA+となった。

SSL Labのキャッシュを削除しないと評価が変わらないので注意。

SSL設定項目整理

参考サイトを丸ごとコピー参考にしたので、何やってるかぐらいは整理しておこう。

2048ビット以上で作ったDH交換鍵

Forwad Secrecyとは、秘密鍵が漏洩してもそれだけでは解読できないようにする仕組み。

鍵の交換にEDH鍵交換方式を使うことで実現する。

PFS(Perfect Forwad Secrecy)は、上記鍵交換にECDHEまたはDHEを使っている場合にいう。

未来に向けた機密保護機能、という名前がかっこいい。

ごめんなさい、ここあんましわかんなかった。。。

OCSP

OCSP(Online Certificate Status Protocol)とは、クライアントがサーバに接続する際、サーバ証明書が正当なものか確認するためのプロトコル。
旧来はCRL(証明書失効リスト)が使用されていたが、リストが巨大化してダウンロードに時間かかるようになったため、OSCPが一般的となった。

OSCPは単一のレコードのみ取得するため速い。しかし、OCSP要求をサードパーティのOCSP responderに対して行うためレイテンシと失敗する可能性が加わる。

これを解決するために、クライアント側でOCSP要求をサーバ側で行い、その応答レコードをキャッシュしておく。
TLSハンドシェイク中にキャッシュしていたOCSPレコードをサーバが証明書とともに送信すすることで、HTTPS通信の高速化ができる。
この機能をOCSP Staplingという。

OCSPが機能してるかどうかはopenssl s_clientコマンドで確認できる。

openssl s_client -connect runble1.com:443 -tls1 -status -reconnect 2>&1 < /dev/null | head

OSCPについては、こちらの記事がわかりやすい。

HSTS

HSTSは、クライアントにHTTPSだけでサイトに接続することを伝えるHTTPヘッダ。

This server’s certificate chain is incomplete. Grade capped to B.

SSL Labsで上のような評価が出た。

証明書を指定する部分をcert.pemのままにしてると出るぞ。

server {
    listen 443 ssl http2;
    server_name runble1.com;

    ssl_certificate /etc/letsencrypt/live/runble1.com/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/runble1.com/privkey.pem;

    # HSTS対応
    add_header Strict-Transport-Security "max-age=31536000" always;

 

参考

無償SSLサーバー証明書Let’s Encryptの普及とHTTP/2および常時SSL化 2ページ

光の速さのWEBサーバー(nginx)をlet’s encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA+にする。

nginx連載6回目: nginxの設定、その4 – TLS/SSLの設定

我々はどのようにして安全なHTTPS通信を提供すれば良いか

Copyright © 2016 空想ブログ All Rights Reserved.

Let's Encryptの証明書を自動更新にする

$
0
0

Let’s Encryptの証明書を自動更新するよう設定する。

SSL証明書には有効期限が存在し、Let’s Encryptの証明書にも有効期限(3ヶ月)は存在する。

自動更新の設定

証明書の更新には「certbot-auto renew」コマンドを使用する。デフォルトでは、有効期限が切れるまでに30日を切っていた場合、更新作業が行われる。

これをcronに登録して、週1で定期的に実行するようにしたらいい。

rootのcrontabに登録するのでrootになる。

su –

crontab を編集する。

crontab -e

certbot-auto renewの処理が成功後、–post-hookでnginxの再起動を行う処理を、毎週日曜午前3次50分に登録。ログは念のため取り貯めておくことにした。

50 3 * * 0 certbot-auto renew --post-hook "systemctl restart nginx" >> /var/log/letsencrypt.log

参考

Let’s EncryptのSSL証明書で、安全なウェブサイトを公開

Copyright © 2016 空想ブログ All Rights Reserved.

WordPressをSSL化したらやるGoogleの設定

$
0
0

WordPressを常時SSL化した

その後、外部サイトとの連携を変更しないといけなかったのでまとめておく。まあ、Googleのやつしかなかったけど。

Google Analytics

既にある設定をそのまま流用できる。

ログイン後、管理→プロパティ設定→デフォルトのURLをhttpsへ変更

Google Search Console(Webマスターツール)

新たに登録しないといけない。

ログイン後、プロパティを追加→Google Analyticsのやつを使用

追加後、sitemap.xmlを送信しておく。

他にも出てきたら追加していく。

参考

Webサイトを「HTTP」から「HTTPS」へ切り替える際に行う一連の作業をまとめました

Copyright © 2016 空想ブログ All Rights Reserved.


CentOS7のtunedを使ったパフォーマンス・チューニング

$
0
0

CentOS7の「tuned」を使って、パフォーマンス・チューニングをおこなう。

チューニングの目的には、省電力モードの設定やディスクI/Oの性能向上などがあるが、今回はさくらVPS上のWordPressサーバを高速に動かすことを目的にする。

tunedとは

tunedは、Linuxの代表的なカーネルパラメータに関してチューニングを行ってくれるデーモンのこと。
OSを稼働したままで動的に変更することができる

まずは動いていることを確認。「active」とでたのでさくらVPSではデフォルトで動いているようだ。

sudo systemctl status tuned

tunedには既に用意されているパラメータのセット(プロファイル)がtuned.confに記述されており、このconfファイルを切り替えることで手軽にチューニングを行える。

さくらVPSでのtuned

tunedのプロファイルを確認する。

sudo tuned-adm list

使用可能なプロファイルと現在使用されているプロファイルを確認できる。
さくらVPSのカスタムインストールのデフォルトでは「virtual-guest」が設定されてた。

Available profiles:
- balanced
- desktop
- latency-performance
- network-latency
- network-throughput
- powersave
- throughput-performance
- virtual-guest
- virtual-host
Current active profile: virtual-guest

 

例えば、一般的なサーバの設定に向いている「throughput-performance」に変更する場合は、以下のコマンド。

sudo tuned-adm profile throughput-performance

ただし、自分は変更しなかった。参考にしたページでは「throughput-performance」を設定していたが、今回は「virtual-guest」でいくことにする。

「virtual-guest」はKVMの仮想マシンに最適化された設定であり、「throughput-performance」のプロファイルも含んでいるため、さくらVPS上で動かすには最適と判断したため。

virtual-guestとthroughput-performance

中身確認しておこう。

cat /usr/lib/tuned/virtual-guest/tuned.conf | grep -v “^#” | grep -v “^$”

throughput-performanceを読み込んでいる。
ほかは仮想メモリやdirty_ratioの設定だ。

[main]
include=throughput-performance
[sysctl]
vm.dirty_ratio = 30
vm.swappiness = 30

ではでは、「throughput-performance」では何をやっているのか。

cat /usr/lib/tuned/throughput-performance/tuned.conf | grep -v “^#” | grep -v “^$”

vm.dirty_ratio と vm.swappinessの値が違うね。

[cpu]
governor=performance
energy_perf_bias=performance
min_perf_pct=100
[disk]
readahead=>4096
[sysctl]
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10
vm.swappiness=10

一つ一つの項目の意味もいずれ理解したい。

参考

CentOS 7の標準環境だけですぐできる、WordPress「5.4倍高速化」テクニック 後編 (1/3)

Copyright © 2016 空想ブログ All Rights Reserved.

さくらVPSにkusanagiぽい構成でWordPressブログをSSL化した作業まとめ

$
0
0

あくまで「ぽい」です。

さくらVPSにkusanagiっぽいWordPress実行環境作る時のまとめ。

kusanagiとは

KUSANAGI とは、高速化チューニング済みWordPress実行環境。

さまざまなクラウド環境で用意されていて、自ら環境構築しなくてもすぐ使える。
ただ、さくらVPSで使いたい場合は自分で作るしかない。

下記記事を参考に作っていく。

とにかく速いWordPress

ただし、完全に一緒の構成では作らない。
例えばプラグイン系は入れてないし、借りているさくらVPSは1Gのため、キャッシュもふんだんに使えってない。

あと、SSL(HTTPS)化はやる。

kusanagi構築手順

まずはさくらVPSにCentOS7をインストールしてセットアップ。

さくらVPSにCentOS7をインストールしたときにやる設定

最新版のnginxをインストール。

CentOS7にyumでnginx1.11をインストール

PHP7をインストール。

CentOS7にyumでPHP7, PHP-FPM, OPcache, APCuをインストール

nginxとphp-fpmで動かしてみる。

nginx + php-fpmでCentOS7でPHP7を最低限動かす

ドメインソケットで動かしてみる。

CentOS7 + nginx + php7-fpm + UNIXドメインソケットでPHP動かす

MySQL5.7をインストール。

CentOS7にMySQL5.7をyumでインストール

WordPressを動かす。

CentOS7, nginx1.11, php7-fpm, MySQL5.7でWordPress動かす

Let’s Encryptを使ってWordPressをSSL化する。

WordPressをLet’s Encryptで常時SSL(HTTPS)化する

SSL LabsでB評価だったのでA+評価にした。

WordPressのHTTPSサイトをA+評価にする

自動更新を有効にする。

Let’s Encryptの証明書を自動更新にする

外部サイトとの連携を整理。

WordPressをSSL化したらやるGoogleの設定

結局何もしなかったCentOS7のチューニング。

CentOS7のtunedを使ったパフォーマンス・チューニング

残タスクとして、FastCGIキャッシュを整理しないと。。

インスパイアtheネクスト

WordPressで3000万PV/月のサイトをさくらのクラウドに構築した話

“いきなり1000倍高速”になるWordPress高速化チューニング済み仮想マシン「KUSANAGI」とは何か

Copyright © 2016 空想ブログ All Rights Reserved.

vagrant上のCentOS7にpyenvでPython3環境構築

$
0
0

データサイエンティストを目指す人のpython環境構築 2016

ほぼこちらを参考にしました。

VagrantでCenOS7を立ち上げる

こちらのブログを参考にvagrant上に作成する。

vagrant cloudに登録されてるvagrant imageから

vagrant init kogurek1/centos72_64_min

vagrant up

vagrant ssh

最新版にする

sudo yum update

pyenvインストール

pyenvに必要なライブラリを入れておく。

sudo yum install git zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel

pyenvにパス通す、pyenvコマンドが使えるようになる

git clone https://github.com/yyuu/pyenv.git ~/.pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc

echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc

echo 'eval "$(pyenv init -)"' >> ~/.bashrc

source ~/.bashrc

現在有効になっているpython環境の確認。

pyenv versions

Anacondaインストール

pyenvを使ってAnacondaの最新版を確認する。

pyenv install -l | grep anaconda

anaconda3-4.1.0だったのでこれをインストールする。

pyenv install anaconda3-4.1.0

pyenv rehash

インストールしたAnacondaを有効にする。

pyenv global anaconda3-4.1.0

pythonのバージョンを確認する。

python --version

Python 3.5.1 :: Anaconda 4.1.0 (64-bit)

参考

CentOS6.5にpyenvでPython3.4をインストール・開発環境構築

Copyright © 2016 空想ブログ All Rights Reserved.

BeautifulSoup4を使ってみる

$
0
0

前回作ったPython3環境でBeautifulSoup4を使う。

Scrapingを勉強する

BeautifulSoupとは

HTMLをフォーマット化し、XML構造としてアクセスできるPythonオブジェクトに変換してくれる。
つまり、タグを指定してHTMLから値を取得してきてくれる。

Anaconda4.1.0にはデフォルトで入っていた。

conda list | grep beautifulsoup4
beautifulsoup4 4.4.1 py35_0

なかったらいれよう。

pip install beautifulsoup4

BeautifulSoupを使ってhtmlをパースする

BeautifulSoupを使ってみる。

vim scrapetest.py

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://www.pythonscraping.com/pages/page1.html")
bsObj = BeautifulSoup(html.read(), "lxml")
print(bsObj.h1)

実行。

python scrapetest.py

対象URLのh1が取得出来たら成功。

本来はurlopenとBeautifulSoupの処理は例外を考えてコード書いてやらないといけない。

その書き方は「PythonによるWebスクレイピング」を見てね。

補足:BeautifulSoupを使うときはParserを指定

書籍通りのコードを実行すると以下のコメントが表示された。

/home/vagrant/.pyenv/versions/anaconda3-4.1.0/lib/python3.5/site-packages/bs4/__init__.py:166: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

To get rid of this warning, change this:

BeautifulSoup([your markup])

to this:

BeautifulSoup([your markup], "lxml")

markup_type=markup_type))

BeautifulSoupを使うときはHTML Parserを指定しろとのこと。lxmlを推奨するとのこと。

# BeautifulSoup([your markup])
BeautifulSoup([your markup], "lxml")

参考

PythonによるWebスクレイピング

Beautiful Soup 4.x では parser を明示指定しよう

Copyright © 2016 空想ブログ All Rights Reserved.

FuelPHP1.7を1.8にバージョンアップ

$
0
0

FuelPHPの1.8系の正式版がリリースされていた。

FuelPHP releases v1.8

FuelPHP1.8の個人的な目玉はPHP7に対応したことだ。

PHP7の環境で使いたいのでFuelPHP1.8.0へバージョンアップする。

FuelPHP1.8.0へバージョンアップ

該当のプロジェクトに入って、バージョンの確認。

php oil -v

Fuel: 1.7.2 running in “development” modeと表示された。

FuelPHPのcoreはcomposerで管理されているので、composer.jsonを修正してアップデートしたらいい。

バックアップとってから修正する。

cp composer.json ~/domposer.json.backup

vim composer.json

requireのところをいかに変更。
githubに上がっているFuelPHPのプロジェクトを参考にした。

“require”: {
“php”: “>=5.3.3”,
“composer/installers”: “~1.0”,
“fuel/core”: “1.8.*”,
“fuel/auth”: “1.8.*”,
“fuel/email”: “1.8.*”,
“fuel/oil”: “1.8.*”,
“fuel/orm”: “1.8.*”,
“fuel/parser”: “1.8.*”,
“fuelphp/upload”: “2.0.6”,
“monolog/monolog”: “1.18.*”,
“phpseclib/phpseclib”: “2.0.0”,
“michelf/php-markdown”: “1.4.0”
},

バージョンアップする。

php composer.phar self-update

php composer.phar update

バージョンを再度確認。

php oil -v

Fuel: 1.8 running in “development” modeと表示された。

ただ、特定のファイルはcomposerからはアップデート出来ていないようで、別途修正してやる必要がある。

対象ファイルは以下
fuel/app/bootstrap.php
public/.htaccess
public/index.php

参考にしたサイトは手動で修正していたが、コピって上書きしました。

参考

【FuelPHP】1.7.2から1.8.0へバージョンアップしてみた

Copyright © 2016 空想ブログ All Rights Reserved.

Vagrant + CentOS7 + nginx + PHP7 + php-fpm でFuelPHP1.8の仮想開発環境を構築する

$
0
0

Macに FuelPHPの開発環境を構築したので、メモしときます。

  • Vagrant1.8.6
  • ViertualBox5.1.6
  • CentOS7.2
  • Nginx1.11.4
  • PHP7
  • FuelPHP1.8

VagrantとVirtualBoxは brewコマンドで入りました。

brew cask install vagrant
brew cask install virtualbox

最終的には、ローカルで修正したら Vagrantでも自動で反映されるようにします。

VagrantでCentOS7仮想環境構築

まずはVagrantで仮想環境を構築します。

mkdir vagrant/furlphp
cd fuelphp

CentOS7のBoxイメージはいつもこちらを使わせてもらっています。
init が終わるとVagrantfielが作成されているので、編集します。

vagrant init kogurek1/centos72_64_min
vim Vagrantfile

ローカルPC上からプライベートIPでアクセスできるようにしときます。

#config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "private_network", ip: "192.168.33.10"

起動して、ログインします。

vagrant up
vagrant ssh

最初に yum updateをしときます。

sudo yum update

nginxインストール

FuelPHPはnginxで動かします。

その前に、今後必要になるツールを先に入れておきます。

sudo yum install vim git

最新版のnginxをインストールするため、リポジトリを追加します。

sudo vim /etc/yum.repos.d/nginx.repo

baseurlはインストールするOSや、nginxのバージョンによって変わります。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

インストールします。1.11.4が入りました。

sudo yum install nginx

起動します、自動起動も有効にしておきます。

sudo systemctl start nginx
sudo systemctl enable nginx

http://192.168.33.10/ にアクセスし、nginxの画面が表示されれば正常に動作しています。

PHP7 + php-fpmインストール

FuelPHPをPHP7で動かすので、PHP7をインストールします。

先にリポジトリを追加します。。

sudo yum -y install epel-release
wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo rpm -ivh ./remi-release-7.rpm

FuelPHP自体で使うエクステンションは3つです。
それに加えて、この環境で必要そうなものも一緒にインストールしときます。

sudo yum install --enablerepo=epel,remi-php70 php php-mcrypt php-mbstring php-fpm php-mysqlnd php-opcache php-apcu

php -v で PHP 7.0.11 が表示されました。

PHPの設定も修正しておきます。

sudo vim /etc/php.ini

変更した部分だけ表示。

display_errors = On
error_log = "/var/log/php_errors.log"
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8

php-fprmを起動し、自動起動を有効にしておきます。

sudo systemctl start php-fpm
sudo systemctl enable php-fpm

nginx + php-fpm設定

nginx と php-fpmを連携します。

sudo vim /etc/nginx/conf.d/default.conf

コメントアウトしたところが元からあった設定です。

location ~ \.php$ {
    #root html;
    root /usr/share/nginx/html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include fastcgi_params;
}

php-fpm側の設定を修正します。

sudo vim /etc/php-fpm.d/www.conf
[/bash

nginx.confで設定しているユーザに修正します。

;user = apache
user = nginx
;group = apache
group = nginx

nginx と php-fpmを再起動し、設定を反映させます。

sudo systemctl restart nginx
sudo systemctl restart php-fpm

default.conf に記述したドキュメントルート上にテスト用のPHPファイルを作成します。

sudo vim /usr/share/nginx/html/index.php

無難に phpinfo を表示させます。

&lt;?php
echo phpinfo();

http://192.168.33.10/index.php にアクセスし、phpinfoページが表示されれば正常に動作しています。

FuelPHP1.8インストール

PHP7 に対応した FuelPHP1.8 をインストールします。

FuelPHPには色々なインストール方法があります。

インストール方法 – インストール – FuelPHP ドキュメント

2016年FuelPHP 1.xのインストール方法のベストプラクティス

ベストプラクティスと言われているのは zipでダウンロードしてくる方法ですが、一旦 git clone でやってみます。

cd /var/www
sudo git clone git://github.com/fuel/fuel.git fuelphp
cd fuelphp
sudo ./composer.phar self-update
sudo ./composer.phar update --prefer-dist

git branchで確認すると、1.8 の masterがインストールされたようです。

git branch
# 以下が表示
* 1.8/master

oil -v でも Fuelphp のバージョンを確認できます。

oil -v
# 以下が表示
Fuel: 1.8 running in "development" mode

nginxに、Fuelphp用のバーチャルサーバを設定します。

sudo vim /etc/nginx/conf.d/fuelphp.conf

nginxの設定はFuelPHPのドキュメントを参考にしました。

server {
    server_name fuelphp.local;

    # これらのファイルに Nginx が書き込めることを確認する
    #access_log /var/www/fuelphp/nginxlogs/access.log;
    #error_log /var/www/fuelphp/nginxlogs/error.log;
    root /var/www/fuelphp/public;

    location / {
        index index.php;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        root /var/www/fuelphp/public;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param FUEL_ENV "development";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

nginxの設定を反映します。

sudo systemctl restart nginx

仮想環境(192.168.33.10)へ「fuelphp.local」でアクセスできるよう、ローカルPCのhosts修正します。

# ローカルPCでの操作です
sudo vim /etc/hosts

IPとホスト名は適宜変更できます。

192.168.33.10 fuelphp.local

fuelphp.localへアクセスし、FuelPHPのウェルカムページが表示されれば正常動作です。

http://fuelphp.local/

synced_folderを使ってローカルのFuelPHPを動かす

FuelPHPを Vagrant上の環境にインストールしましたが、ローカルPC上にてIDEで開発したいので、Vagrantの synced_folder機能を使って、ローカルPCと Vagrantのディレクトリを同期させます。
開発はローカルPC、動作は Vagrantという構成です。

予め、Vagrant上に git cloneで取得した FuelPHPは削除しておきます。

sudo rm -rf fuelphp

以下からはローカルPC上での作業です。

今度は FuelPHPを本家サイトからダウンロードしてきました。
git cloneよりも速かったです。

# ローカルPCでの操作
curl http://fuelphp.com/files/download/36 -o fuelphp.zip
unzip fuelphp.zip
cd fuelphp
php oil refine install
php composer.phar self-update
php composer.phar update

バージョンを確認します。
FuelPHP1.8 がダウンロードされていました。

oil -v
# 以下が表示
Fuel: 1.8 running in "development" mode

git管理はされていないようです。

git branch
# 以下が表示
fatal: Not a git repository (or any of the parent directories): .git

Vagrantの設定を変更します。

cd ~/vagrant/fuelphp
vim Vagrantfile

synced_folderの設定を追加します。
ディレクトリの記述は、1つめがローカルPCで、2つめがVagrant上のものになります。

 config.vm.synced_folder "/Users/runble1/work/fuelphp", "/var/www/fuelphp",
 :owner = "nginx",
 :group = "nginx",
 :mount_options = ["dmode=755,fmode=644"]

Vagrantを再起動し、再度 Vagrant内での操作になります。

vagrant reload
vagrant ssh

nginxの設定を行います。

# Vagrant上での操作
sudo vim /etc/nginx/nginx.conf

off にしとかないと、CSSを修正した際に反映されないことがあるようです。

#sendfile on;
sendfile off;

nginxの設定を反映させます。

sudo systemctl restart nginx

 

再度「fuelphp.local」へアクセスし、ウェルカムページが表示されることを確認します。

以上、開発環境の構築完了。
MySQLのDB環境が必要になった場合は、下記記事を参照します。

CentOS7にMySQL5.7をyumでインストール

めっちゃ疲れた。。

参照

CentOS7にyumでnginx1.11をインストール

CentOS7にyumでPHP7, PHP-FPM, OPcache, APCuをインストール

nginx + php-fpmでCentOS7でPHP7を最低限動かす

Copyright © 2016 空想ブログ All Rights Reserved.

[nginx] FuelPHPのサイトを SSL(HTTPS)化して SSL Labsで A+評価をもらう

$
0
0

FuelPHPで作ったサイトを SSL(HTTPS)化した際のメモです。

証明書は Let’s Encrypt のものを使います。無料で導入も楽ちんです。
最終的に SSL Labsで A+評価をいただきました。

以下の手順は、FuelPHP + nginx + CentOS7 で構築したサイトに、ドメインでアクセスできている前提になります。

CentOS7のfirewalld設定

FuelPHPはCentOS7で動かしています。

CentOS7からファイアウォールの設定は、firewalldで行うようになりました。
CentOS6まで使っていた iptablesとは使い方が違うので調べておく必要があります。

今回は、https通信を許可する設定を行います。

# httpsを許可
sudo firewall-cmd --add-service=https --permanent
# firewalldの設定をリロード
sudo firewall-cmd --reload

設定後に、httpsが許可されていることを確認しましょう。

sudo firewall-cmd --list-services --zone=public --permanent
# 以下が表示されればOK
https

Let’s Encryptの証明書を生成

Let’s Encrypt は無料のSSL証明書を発行する認証局です。
certbot コマンドで証明書の生成・更新ができます。

certbot コマンド自体も、CentOS7 では yum でインストールできます。
CentOS7, nginx用の設定方法を見ながら設定します。

sudo yum install epel-release
sudo yum install certbot

certbot コマンドが使えるようになっているので、証明書を生成します。
GUIがターミナル上に表示されるので進めましょう。

sudo certbot certonly --webroot -w /var/www/it-review/public -d it-review.runble1.com --email xxxxx@gmail.com

生成されたファイルを確認しましょう。
4つファイルができています。

sudo ls -la /etc/letsencrypt/live/it-review.runble1.com

cert.pem:サーバ証明書
chain.pem:中間証明書
fullchain.pem:サーバ証明書と中間証明書を結合したファイル
privkey.pem:秘密鍵

nginx で使うのは fullchain.pem です。

nginxにFuelPHP用のSSL設定

FuelPHPサイト用の nginxに SSL設定を追記します。
SSL Labsで A+評価になるようにします。

sudo vim /etc/nginx/conf.d/it-review.conf

まずは全貌。

server {
    # httpでのアクセスを全てhttpsへリダイレクト
    listen 80;
    listen [::]:80;
    server_name it-review.runble1.com;
    return 301 https://it-review.runble1.com$request_uri;
}
server {
    # SSLに加えてHTTP/2を有効に
    listen 443 ssl http2;
    server_name it-review.runble1.com;

    # サーバ証明書
    ssl_certificate /etc/letsencrypt/live/it-review.runble1.com/fullchain.pem;
    # 秘密鍵
    ssl_certificate_key /etc/letsencrypt/live/it-review.runble1.com/privkey.pem;

    # SSLセッションキャッシュを全てのワーカープロセスで共有
    ssl_session_cache shared:SSL:30m;
    ssl_session_timeout 30m;

    # OCSP Stapling用
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/it-review.runble1.com/fullchain.pem # HSTS対応 add_header Strict-Transport-Security "max-age=31536000" always;

    # 2048ビット以上で作ったDH交換鍵を指定
    ssl_dhparam /etc/ssl/private/dhparam.pem;

    # HSTS対応
    add_header Strict-Transport-Security "max-age=31536000" always;

    # サーバが示した暗号スイートの優先
    ssl_prefer_server_ciphers on;
    # 暗号スイート
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    # 以下略

各項目を簡単にですが理解しておきます。

1つめの serverディレクティブでは、httpでアクセスしてきた場合の設定です。
全て https にリダイレクトします。

server {
    # httpでのアクセスを全てhttpsへリダイレクト
    listen 80;
    listen [::]:80;
    server_name it-review.runble1.com;
    return 301 https://it-review.runble1.com$request_uri;
}

2つめの serverディレクティブ内で httpsに対する設定や PHPの設定(今回は割愛)をおこないます。
SSL通信に加えて HTTP/2プロトコルを有効にしています(OpenSSL1.0.1を使用している場合は Chromeでは HTTP/2通信できません)。

server {
    # SSLに加えてHTTP/2を有効に
    listen 443 ssl http2;
    server_name it-review.runble1.com;

certbotコマンドで生成した Let’s EncryptのSSL証明書と秘密鍵を指定します。

    # サーバ証明書
    ssl_certificate /etc/letsencrypt/live/it-review.runble1.com/fullchain.pem;
    # 秘密鍵
    ssl_certificate_key /etc/letsencrypt/live/it-review.runble1.com/privkey.pem;

SSLセッションキャッシュの設定を行います。
キャッシュするとSSLの設定を使いまわして負荷軽減になります。

    # SSLセッションキャッシュを全てのワーカープロセスで共有
    ssl_session_cache shared:SSL:30m;
    ssl_session_timeout 30m;

OSCP stapingを有効にします。
OCSP(Online Certificate Status Protocol)とは、HTTPS通信で証明書の失効を確認する手順のことで、サーバ側で失効リストをキャッシュしておきます。そのためHTTP通信を高速化できます。

    # OCSP用
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/it-review.runble1.com/fullchain.pem

DH鍵を指定します。

    # 2048ビット以上で作ったDH交換鍵を指定
    ssl_dhparam /etc/ssl/private/dhparam.pem;

サーバ側から暗号スイートを指定して優先して使ってもらうよう設定しておきます。

    # サーバが示した暗号スイートの優先
    ssl_prefer_server_ciphers on;
    # 使用する暗号スイート
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

HSTSを有効化します。
サーバからブラウザへ常時HTTPSで通信するようリクエストを行う。

    # HSTS対応 serverディレクティブ内に書かないといけない
    add_header Strict-Transport-Security "max-age=31536000" always;

最後に。

SSL の共通設定は conf ファイルを別に作ってまとめておいてもいいかもしれません。
使い回せます。

# SSLセッションキャッシュを全てのワーカープロセスで共有
ssl_session_cache shared:SSL:30m;
ssl_session_timeout 30m;

# 2048ビット以上で作ったDH交換鍵を指定
ssl_dhparam /etc/ssl/private/dhparam.pem;

# OCSP Staplingを有効にする
ssl_stapling on;
ssl_stapling_verify on;

# サーバが示した暗号スイートの優先
ssl_prefer_server_ciphers on;
# 暗号スイート
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

Let’s Encryptの証明書を自動更新にする

SSL証明書は有効期限が存在します。
更新作業は、certbotコマンドで簡単に行うことができます。

root ユーザで cron を設定します。

su -

1週間に1度ぐらいの頻度で証明書の有効期限を確認し、更新をかけます。

50 3 * * 0 certbot renew --post-hook "systemctl restart nginx" >> /var/log/letsencrypt_certbot.log

参考

WordPressをLet’s Encryptで常時SSL(HTTPS)化する

Let’s Encryptの証明書を自動更新にする

WordPressのHTTPSサイトをA+評価にする

NginxでのOCSP Stapling対応設定


PHP7 + FuelPHP1.8 で PHPUnitでテストする

$
0
0

ローカルPC上に PHP7, FuelPHP1.8環境を構築しました。

php -v
# 以下が表示
PHP 7.0.11 (cli) (built: Oct 2 2016 00:32:27) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
cd fuelphp
oil -v
# 以下が表示
Fuel: 1.8 running in "development" mode

テストを実行してみます。
FuelPHPでは oilコマンドからテストを実行できるようです。

oil test
# 以下が表示
Uncaught exception Oil\Exception: PHPUnit does not appear to be installed.

Please visit http://phpunit.de and install.
Callstack:
#0 /Users/runble1/work/fuelphp/oil(68): Oil\Command::init(Array)
#1 {main}

見事に失敗したので、FuelPHP1.8で PHPUnitを実行できるようにします。

FuelPHP1.8で PHPUnitを実行する

エラーを見ると PHPUnitが見当たらないとのことです。
composerでインストールされていないのか確認します。

cat composer.json | grep phpunit

ないですね・・・
本家サイトの composer.json を確認してもないようです。

PHPUnitをインストールしましょう。
最新の安定版は PHPUnit5.6です。

phpunitのインストールは composerで行います。

vim composer.json
"require": {
    "php":"5.3.3",
    〜省略〜
    "phpunit/phpunit":"5.6.*"
},

インストールします。

./composer.phar update
# 以下が表示
- Installing phpunit/phpunit (5.6.2)
 Downloading: 100%

PHPUnitにパスを通します。

vim fuel/app/config/oil.php
<?php

return [
    'phpunit' => [
        'binary_path' => APPPATH . '../vendor/bin/phpunit'
    ]
];

テストできるようになりました。

oil test
# 以下が表示
Tests Running...This may take a few moments.
PHPUnit 5.6.2 by Sebastian Bergmann and contributors.

............................................................... 63 / 402 ( 15%)
............................................................... 126 / 402 ( 31%)
............................................................... 189 / 402 ( 47%)
............................................................... 252 / 402 ( 62%)
............................................................... 315 / 402 ( 78%)
............................................................... 378 / 402 ( 94%)
........................ 402 / 402 (100%)

Time: 574 ms, Memory: 12.00MB

OK (402 tests, 497 assertions)

参考

FuelPHPで、oil test したときに、「Uncaught exception Oil\Exception: PHPUnit does not appear to be installed.」と言われた時にすること

PHP7でFuelPHPを使うぞ!!

ユニットテスト

Community版 PyCharmを Mac + pyenv で使ってみる

$
0
0

Community PyCharm概要

PyCharmは Python専用の IDEです。
Eclipseの起動が遅かったため、試してみることにします。

PyCharmには有償の Professional Edition と無償の Community Edition があります。

無償版では、 Web開発(HTML,CSS,JavaScript)や Pythonフレームワーク、DB系のサポートがないようです。
本家サイトに比較が載っています。

しかし、Pythonの構文解析は同等の機能が提供されているようです。

PyCharmの概要は下記サイトがとても詳しいです。

最強のPython統合開発環境PyCharm

PyCharmインストール

PyCharmは JetBrains社のサイトからダウンロードできます。

今回は Community版を使います。つまり無償版です。

PyCharmとpyenvの連携

Mac上での pyenvの使い方はこちらをご参照ください。

pyenv --version
# 以下が表示
pyenv 1.0.2

pyenvでインストールされているバージョンを確認します。
system(set by /Users/runble1/.pyenv/version) は Macにデフォルトで入ってる Pythonになります。

pyenv versions
# 以下が表示
* system (set by /Users/runble1/.pyenv/version)
 3.5.2

File → Default Preferences → Project Interpreter → 右上の歯車マーク → Add Local

ここで、pyenvでインストールした Pythonのバージョンを指定します。

~/.pyenv/versions/3.5.2/bin/python3.5

これから触ってみて良ければ有償版を購入します。

参考

【Python】IDEのPyCharmのインストールと初期設定について

最強のPython統合開発環境PyCharm

Vagrant + CentOS7 + pyenv + Python3 環境構築

$
0
0

Mac上の Vagrantに CentOS7環境を用意して Pythonの開発環境を構築します。

root権限でpyenvに入れるケースです。
root権限でないケースはこちらを参照。

VagrantでCenOS7仮想環境を構築

こちらのブログを参考に Vagrant上に CentOS7環境を構築する。
vagrant cloudに登録されてるvagrant imageを取得し、仮想環境を立ち上げてログインする。

vagrant init kogurek1/centos72_64_min
vagrant up
vagrant ssh

OSを最新版にしておきます。

sudo yum update

pyenvインストール

まず、pyenvに必要なライブラリをインストールします。

sudo yum install git zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel

pyenvは githubから取得します。
今回は /usr/localディレクトリに root権限で配置します。

cd /usr/local
sudo git clone https://github.com/yyuu/pyenv.git ./pyenv

pyenvにパス通し、pyenvコマンドが使えるようにします。

sudo vi /etc/profile.d/pyenv.sh
export PYENV_ROOT="/usr/local/pyenv"
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"

環境変数を再読込みします。
pyenvコマンドが使えるようになります。

exec $SHELL -l

pyenvのバージョンを確認してみます。

pyenv -v

pyenv 1.0.2-48-g41606c4

ただし、 pyenvでインストールする場合は、sudoを付ける必要があります。
sudo時にPATHが引き継がれるようにします。

sudo visudo
#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults env_keep += "PATH"
Defaults env_keep += "PYENV_ROOT"

Python3インストール

まず、pyenvでインストールできるバージョンを確認しましょう。

pyenv install -l

# 〜省略〜
 3.5.1
 3.5.2

Python単体では 3.5.2が最新でした。
しかし、なぜか 3.5.2のインストールが失敗したため、3.5.1をインストールします。

sudo pyenv install 3.5.1
sudo pyenv rehash

現在有効になっている python環境の確認してみます。

pyenv versions

* system (set by /usr/local/pyenv/version)
  3.5.1

デフォルトで入っている Pythonを使用しているようです。
バージョンを確認すると 2.7.5でした。

python --version

Python 2.7.5

pyenvでインストールした Pythonを指定、グローバルで使うよう設定します。

sudo pyenv global 3.5.1
pyenv versions
 
 system
* 3.5.1 (set by /usr/local/pyenv/version)

インストールした Pythonのバージョンになっています。

python --version

Python 3.5.1

参考

データサイエンティストを目指す人のpython環境構築 2016

CentOS7 pyenvを利用したpython環境構築

CentOS6.5にpyenvでPython3.4をインストール・開発環境構築

Vagrant上のCentOS7にpyenvでAnaconda(Python3)環境構築

pyenv + pyenv-virtualenv で Python仮想環境作成

$
0
0

Vagrant + CentOS7 + pyenv + Python3 環境構築

こちらで作成した Pythonの環境に、複数の隔離された仮想環境を作成していきます。

方法としては virtualenv か pyenv-virtualenv のどちらかを使うようです。どちらがいいのでしょうか。

そもそも仮想環境が必要な場合

開発環境で、複数の Pythonプロジェクトを開発しており、プロジェクト間では異なるパッケージを利用する場合です。

プロジェクトごとにインストールするパッケージを切り替えられると便利です。

pyenv, virtualenv, pyenv-virtualenvとは

以下、簡単な認識合わせを。

機械学習名古屋_第7回勉強会_Python環境構築方法.key

pyenv

1台の PC 内で異なるバージョンの Python を使う場合に使用します。

LinuxOSには Python が標準でインストールされており、そのバージョンは 2系の古いやつです。この標準インストールされている Python に影響与えず Python3系を使用するため、pyenvを使います。

pyenv local でディレクトリごとに使用する Pythonのバージョンを選択することができます。

ただし、pyenv local で選択するバージョンは、pyenv上で共通です。異なるディレクトリに対して pyenv local を設定してもパッケージの追加・更新などの影響を与えあってしまいます。pyenv だけでは同一バージョンで独立した環境を構築できません。

この問題を解決するには virtualenv か pyenv-virtualenv を使う必要があります。

virtualenv

同一バージョンの Python 環境で、複数の環境を使い分けたい場合に使います。

pyenv が出てくる前から使われているため、pyenv がなくても使えま。virtualenv はパッケージなため、pip からインストールできます。

pyenv-virtualenv

同一バージョンの Python 環境で、複数の環境を使い分けたい場合に使います。pyenv コマンドで実行できます。

例えば pyenv でインストールした 3.5.1 の環境を 2つ作りたいなどです。これは 3.5.1 の隔離された仮想環境を 2つ作って解決します。

実際に使ってみます。

pyenv + pyenv-virtualenv 使い方

本家サイトを参考にしていきます。

pyenv-virtualenvプラグインをインストールします。

# Macの場合
brew install pyenv-virtualenv

pyenv を github から インストールした場合は、 pulugin 配下に git clone して直接配置します。

# Linuxの場合
cd /usr/local/pyenv/plugins
sudo git clone https://github.com/yyuu/pyenv-virtualenv.git
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
exec "$SHELL"

現在の pyenv でインストールされている Pythonを確認してみると、Python の 3.5.1 のバージョンが使えます。

pyenv version

# 以下が表示
3.5.1 (set by /usr/local/pyenv/version)

この Python3.5.1 の仮想環境を作成してみます。

sudo pyenv virtualenv 3.5.1 uwsgi

uwsgi 仮想環境が作成されています。

pyenv versions

# 以下が表示
system
* 3.5.1 (set by /usr/local/pyenv/version)
3.5.1/envs/uwsgi
uwsgi

仮想環境一覧も確認してみます。

pyenv virtualenvs

# 以下が表示
3.5.1/envs/uwsgi (created from /usr/local/pyenv/versions/3.5.1)
uwsgi (created from /usr/local/pyenv/versions/3.5.1)

uwsgi 仮想環境を有効にします。

sudo pyenv local uwsgi

仮想環境が有効になっています。

pyenv versions

# 以下が表示
system
3.5.1
3.5.1/envs/uwsgi
* uwsgi (set by /home/vagrant/work/uwsgi/.python-version)

仮想環境から新しい仮想環境も作ることができるようです。
その場合、パッケージ等は引き継がれます。

結論

virtualenv と pyenv-virtualenv を使う目的は同じです。

pyenv-virtualenv も仮想環境として十分活用できそうです。pyenvコマンドで全て解決するためシンプルですね。

参考

機械学習名古屋_第7回勉強会_Python環境構築方法.key

[Python]pyenvとvirtualenvとpyenv-virtualenv

Pyenvとvirtualenv pluginによるPython環境を構築する

Scarpy1.1でクローリングする

$
0
0

Python による Web スクレイピング

こちらの参考書を元にスクレイピングを行ったので、自分用のメモを残します。

Scrapyの使い方

Python3.5 の環境が整っているものとします。

scarpy をインストールします。pip からインストールできます。

pip install scrapy

インストールされたか確認しましょう。

conda list | grep Scrapy
Scrapy 1.1.1 pip

Scrapyプロジェクトを作成します。

scrapy startproject wikiSpider

# いかが表示される
New Scrapy project 'wikiSpider', using template directory '/home/vagrant/.pyenv/versions/anaconda3-4.1.0/lib/python3.5/site-packages/scrapy/templates/project', created in:
/home/vagrant/work/wikiSpider

You can start your first spider with:
cd wikiSpider
scrapy genspider example example.com

以下のような構成の wikiSprider ディレクトリが作成されます。

- wikiSpider
 ・ __init.py__
 ・ items.py
 ・ pipelines.py
 ・ settings.py
 - spiders
  ・ __init.py__

作成されていた items.py を修正します。

vim wikiSpider/items.py

今回はページタイトルのみを取得します。
この Itemオブジェクトは Webサイトの1ページを表します。

from scrapy import Item, Field

class Article(Item):
    title = Field()

続いて実際にデータを取得するプログラムを記述します。

vim wikiSpider/spiders/articleSpider.py
from scrapy.selector import Selector
from scrapy import Spider
from wikiSpider.items import Article

class ArticleSpider(Spider):
    name = "article"
    allowed_domains = ["en.wikipedia.org"]
    start_urls = ["http://en.wikipedia.org/wiki/Main-Page",
                  "http://en.wikipedia.org/wiki/Python_%28programming_language%29"]

    def parse(self, response):
        item = Article()
        title = response.xpath('//h1/text()')[0].extract()
        print("Title is:"+title)
        item['title'] = title
        return item

この ArticleSpide を実行します。「article」は ArticleSpider の name=article という行で定義されている名前です。

scrapy crawl article

#デバッグ情報とともに以下が表示されていれば成功。
Title is:Main Page
Title is:Python (programming language)

参考

Python による Web スクレイピング

Python 3をサポートしたScrapy 1.1が公開されました

Viewing all 167 articles
Browse latest View live