ぶろぐ

日記です

wordpress高速化メモ

ざっと調べてみた。前提としてaws環境を使用。

Wordpress自体を高速化する

カリカリにチューニングされた状態でAMIが公開されている様子。let's encryptなど必要になりそうなものが諸々入っているので、1から作る場合やガッと移行できそうなら良さそう。ページキャッシュ機能付き。

仮想マシン構成

WordPress 最新版(KUSANAGI 専用プラグイン同梱)
CentOS 7
・Nginx 1.9
Apache 2.4
・HHVM 3.11
PHP 7.0(php-fpm, Cli
PHP 5.6(php-fpm, Cli
MariaDB Galera Server 10.0
※PHP7.0の利用は、WordPress4.4以上、および対応プラグインが必須です。

kusanagi.tokyo

CloudFrontを前段に置く

CloudFront as Reverse Proxyという構成らしい。nginxとかvarnish置かなくていいのかー。素晴らしい。

ボトルネック確認

  • Debug Bar
  • Debug-Bar-Extender

どこに処理時間がかかっているのかを確認できるプロファイラ

パフォーマンス監視

NewRelicいれてBefore/Afterでプロダクション環境のパフォーマンスがこんなに改善されましたよー、と分かるように。無料プラン内で十分使える。

KUSANAGIに変えるかそれ相当にし、CloudFrontを置いて、DBでボトルネックになっているところがない状態にすれば静的コンテンツ並に高速になるんじゃないかなー、と思います

golangからcloudsearchを使う

sdk install

go get github.com/aws/aws-sdk-go/...

example code

package main

import (
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/cloudsearchdomain"
)

func main() {
	svc := cloudsearchdomain.New(session.New(&aws.Config{
		Region:   aws.String("ap-northeast-1"),
		Endpoint: aws.String("http://search-XXXX.ap-northeast-1.cloudsearch.amazonaws.com"),
	}))

	params := &cloudsearchdomain.SearchInput{
		Query: aws.String("Iron Man 2"),
	}
	resp, err := svc.Search(params)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println(resp)
}

run

go run cloudsearch.go
{
  Hits: {
    Found: 1,
    Hit: [{
        Fields: {
          running_time_secs: ["7440"],
          image_url: ["http://ia.media-imdb.com/images/M/MV5BMTM0MDgwNjMyMl5BMl5BanBnXkFtZTcwNTg3NzAzMw@@._V1_SX400_.jpg"],
          rank: ["276"],
          directors: ["Jon Favreau"],
          actors: ["Robert Downey Jr.","Mickey Rourke","Gwyneth Paltrow"],
          rating: ["7.0"],
          genres: ["Action","Adventure","Sci-Fi"],
          plot: ["Tony Stark has declared himself Iron Man and installed world peace... or so he thinks. He soon realizes that not only is there a mad man out to kill him with his own technology, but there's something more: he is dying."],
          title: ["Iron Man 2"],
          year: ["2010"],
          release_date: ["2010-04-26T00:00:00Z"]
        },
        Id: "tt1228705"
      }],
    Start: 0
  },
  Status: {
    Rid: "uZ/D68sqFQp5O20=",
    Timems: 12
  }
}

golangのinterface

package main

import "fmt"

func main() {
	var repo UserRepository
	repo = NewUserRepositoryDB()
	user := repo.Resolve(1)
	fmt.Println("user:", user)
	user.Name = "ChangedName"
	repo.Save(user)
}

type User struct {
	ID int64
	Name string
}

type UserRepository interface {
	Save(user User)
	Resolve(id int64) User
}

type UserRepositoryDB struct{}
func NewUserRepositoryDB() UserRepositoryDB{
	return UserRepositoryDB{}
}

func (this UserRepositoryDB) Save(user User) {
	fmt.Println("[call] save:", user)
}

func (this UserRepositoryDB) Resolve(id int64) User {
	fmt.Println("[call] resolve:", id)
	return User{id, "user"}
}

実行

$ go run hoge.go
[call] resolve: 1
user: {1 user}
[call] save: {1 ChangedName}

HogeRepositoryでInterface切って、実装クラスはDIできるようにすると捗りそう。