開発環境の構築2(nginx+PHP(FastCGI)+Laravel)

アプリケーションの類いを入れる

とりあえずPHPの動くwebサーバー立てようぜ!という感じ
気分的にnginx+PHP(FastCGI)+Laravelが動くまで

nginx

どうせアクセス来ないしapacheでもいいんだけど、手元にある本がnginxのみなのでこちらに
相変わらずapt-getで最新が取れないようなので
http://wiki.nginx.org/Install

$ sudo -s
# nginx=stable # use nginx=development for latest development version
# add-apt-repository ppa:nginx/$nginx
# apt-get update 
# apt-get install nginx
# nginx -v
nginx version: nginx/1.4.7

にあるままに実行

MySQL
$ sudo apt-get install mysql-server mysql-client -y
$ sudo mysql_secure_installation

mysql_secure_installationなんて物があるんですね。最低限の設定でしょうけど。
5.5.35が入った
文字コードくらいは先に設定した方がよさげ(追記)

$ sudo vim /etc/mysql/my.cnf
[mysqld]
character-set-server=utf8
skip-character-set-client-handshake
PHP

nginxとPHPを一緒に使うのは初めてだけど、fpmってのを入れれば良いのかしら?

$ sudo apt-get install php5-fpm php5-cli php5-mysql php5-json php5-curl php5mcrypt php5-memcached -y

5.5.3が入った模様
php5-json php5-curl php5mcryptは入れようかなーと考えているlaravelで必要
php5-memcachedをキャッシュとして使用予定

memcached
$ sudo apt-get install memcached
$ sudo vi /etc/memcached.conf

とりあえず設定は無しでいいや

laravel

確定ではないけどフレームワークとしてlaravelを入れてみる
Laravel - The PHP framework for web artisans.

$ wget http://laravel.com/laravel.phar
$ sudo mv laravel.phar /usr/local/bin/laravel
$ sudo chmod 755 /usr/local/bin/laravel

適当なディレクトリで

$ laravel new hoge
$ cd hoge
$ chmod 777 -R app/storage
$ vi app/config/app.php
localとかtimezonの設定
nginx設定 for laravel

/etc/nginx/conf.d/に入れればいいのか?

$ vim hoge.conf
  1 server {
  2     listen 80;
  3     server_name doujin-ongaku.jp;
  4
  5     access_log /var/log/nginx/doujin-map.access.log;
  6     error_log /var/log/nginx/doujin-map.error.log;
  7
  8     root /var/www/hoge/public;
  9
 10     location / {
 11         index index.php;
 12         try_files $uri $uri/ /index.php?$query_string;
 13     }
 14
 15     location ~ \.php$ {
 16         fastcgi_pass unix:/var/run/php5-fpm.sock;
 17         fastcgi_index  index.php;
 18         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 19         include   /etc/nginx/fastcgi_params;
 20     }
 21 }

fastcgi_passの項目は「127.0.0.1:9000」になってる情報もあったけど、
/etc/php5/fpm/pool.d/www.conf の listen の設定次第の模様
どっちがいいか、みたいのもあるっぽいけどとりあえず動く方で
(よく分からない設定を変えたくないだけ)

動作

hostsを設定してドメインに飛んでみると…

Mcrypt PHP extension required.」

入れたやん!さっき入れたやん!

$ php -m
[PHP Modules]
...
iconv
json
libxml
mbstring
mhash
mysql
mysqli
...

無い・・・?

解決方法↓
Can't use PHP extension Mcrypt in Ubuntu 13.10 (Nginx, PHP-FPM) - Ask Ubuntu
Ubuntu13.10だと起きる感じっぽい

$ sudo ln -s /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/mcrypt.ini
$ sudo php5enmod mcrypt
$ sudo service php5-fpm restart

f:id:miyawa:20140419123917p:plain
arrived!!

開発環境の構築

MAP用ではなく自分でなんでもいじる用の開発環境を作ります
すでにさくらのVPSがそんな用途なんですが、スペック過多感がすごいので次の契約は継続しない方針で…。
そもそも仕事でも使う必要があったせいで、お金を払う価値はあった物のごちゃごちゃしすぎてしまったのも原因
まあでもVPSがいいよね

Digital Ocean

使うのはVPSとしては最近よく聞く?DigitalOcean
ここのプロモコードを得るために半月構築開始が遅れましたw

linodeは前に作ろうとしたら初めのイメージを入れるときに失敗してから使う気が起きません。
ConoHaたんとかさくらはちょい高いですね

ぶっちゃけDigitalOcean使ったことありますけど、前に普通に何時間か落ちたし、日本にないためか普通に初めの接続遅いです
アジアということでシンガポールに期待しましたが遅いです。

やったこと

VPSはroot権限渡されて終わりなので始めの設定が面倒ですね
初めて触ったときは、一から組み立てる楽しさがありましたが・・・

  1. apt-get updateみたいの
  2. ユーザー作成とパスワード変更 sudo権限
  3. ログイン用鍵の登録
  4. sshd周りの変更(ポートの変更・パスワードログイン不可・Rootログイン不可など)
  5. Timezoneの変更 sudo dpkg-reconfigure tzdata
  6. .vimrc .screenrc .bashrc .inputrcとかをいじる(というか持ってくる)

基本設定はこんなもんですかね?
やべぇCentOSの方が慣れてる…。

ここで力尽きる

AngularJsでController実行前に処理する方法

AngularJsでrouteProvideで処理を分けているけど、ログインチェックとかを共通でController実行前にしたいなぁと思いつついまいち情報がなかったのでメモ

resolveと$q 使って処理すればいけそうな感じで
http://stackoverflow.com/questions/18010796/return-interdependent-async-promises-in-routeprovider-resolve
http://stackoverflow.com/questions/17731942/how-to-load-data-synchronously-in-angularjs-application
これつかっていけたぜヒャッホウと思ったら、リロードでうまく動かないことがあったので(勘違いもあったかも)
http://stackoverflow.com/questions/16286605/initialize-angularjs-service-with-asynchronous-data#16754186
こちらの方法でうまくいった。

app.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      when('/', {
        templateUrl: 'partial/index.html',
        controller: 'IndexCtrl',
        resolve: {
          user: function($q, loginCheck){
            var d = $q.defer();
            loginCheck(d);
            return d.promise;
          }
        }
      }).
      otherwise({
        redirectTo: '/'
      });
  }]);

app.factory('loginCheck', ['$q','$http', '$rootScope', function($q, $http, $rootScope) {
  return function(d) {

    $http({
      method: 'POST',
      url: '/user',
    }).
      success(function(data, status, headers, config) {
        $rootScope.hoge = data;
        d.resolve(data);
      }).
      error(function(data, status, headers, config) {
          d.reject(status);
        }
      });
    return d.promiss; // ここは怪しい
  }
}]);

app.controller('IndexCtrl', ['$scope', '$rootScope', 'user',
  function($scope, $rootScope, user) {
     console.log(user);
    console.log($rootScope.hoge);
  }
]);
       

ちょっと書き換えたりしているのでもしかしたら動かないかも
そもそもfactoryとかserviceとかいろいろあってよくわかってないのです。