Apache2.4でphp-fpmを使っている際の.htmlファイル内php実行


Apache2.4でphp-fpmを使っていて、
htmlファイル内にあるphp処理を実行したい時のメモ。


httpd.conf の 内に以下の設定をする。

<Directory "/var/www/html">
   
   (その他設定)
   
   <FilesMatch "\.(php|html)$">
       SetHandler "proxy:fcgi://127.0.0.1:9000/"
   </FilesMatch>
</Directory>

ロードバランサー使用時/未使用時のhttps/httpリダイレクト


特定のhtmlページへのhttpsアクセスをhttpにリダイレクトしたい時に
ちょっと手間どったのでメモ。

ファイル設置場所

testディレクトリに.htaccessを設置する

ロードバランサーなしの場合

RewriteEngine on
RewriteCond %{HTTPS} on
RewriteRule ^sample.html$ http://www.hogehoge.co.jp/test/sample.html [R=301,L]

ロードバランサーありの場合

443 → 80 の変換をしている場合、
httpsがhttpに変換されるので元プロトコロで判断します。


RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} ^https$
RewriteRule ^sample.html$ http://www.hogehoge.co.jp/test/sample.html [R=301,L]


条件を間違うとリダイレクトループが発生してページを表示できなるので注意(できなくなった)。
リダイレクト先の間違いにも注意する(間違えた)。


[R=301,L] のR=301 はhttpステータス301(恒久的に移動)を意味します。
L は Ruleにマッチした場合に、以降のルールを適用しません。

【開発】Windowsのローカル環境で動いていたCodeIgniterのコードがMacで動かなかった

原因1

mysqlのソケットが正しくなかった。
ので、macphp.iniに追加した。
cp /etc/php.ini.default /etc/php.ini
vim /etc/php.ini
追加:
mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock
【参考: http://www.hi-ho.ne.jp/tsumiki/book_sup2.html


原因2

セッションファイルの書き込みに失敗していた
https://teratail.com/questions/12993
mkdir /Users/shima/Documents/tmp
chmod 777 /Users/shima/Documents/tmp
CodeIgniterのconfig.php
追加:
$config['sess_save_path'] = '/Users/shima/Documents/tmp';
【参考: https://teratail.com/questions/12993

JavaEE7のJPAについて


わかりやすいJavaEEウェブシステム入門
http://www.amazon.co.jp/dp/4798042161
のプログラムを実行していた時に起きた現象と解決策のメモ。


現象

15章
sample22-01 を実行すると
/Users/shima/01abc/64Java/projects/sample22-01/nbproject/build-impl.xml:1048: モジュールはデプロイされませんでした。
重大: Exception while preparing the app : Invalid resource : jdbc/mydb__pm
のエラーになる。


検索結果(未解決)
http://youshe.hatenablog.com/entry/2015/03/29/230001


解決策

persistence.xmlを削除して、再度作成する。
データソースに「新しいデータソース」
JNDI名に「java:app」
データベース接続に「mydb」
を設定する。



persistence.xml
jdbc/mydb

java:app/jdbc/mydb
に変更される。

XAMPPでNetBeansのPHPサンプルアプリを実行する

NetBeansPHPサンプルアプリ(TodoList)を動かした時のメモです。


XAMPPをインストールする
https://www.apachefriends.org/jp/index.html


NetBeansをインストールする
https://ja.netbeans.org/


XAMPP その1

管理者として
C:\xampp\xampp-control.exe
を実行する


XAMPPコントロールパネルにて、ApacheMySQLを実行(Startボタンを押下)する。


NetBeans その1

起動した時の開始ページの「サンプルプロジェクトを試す」を選択、
カテゴリ:PHP
プロジェクト:TodoList
を選択して次に。


プロジェクトフォルダ、ソースフォルダを
C:\xampp\htdocs\TodoList
に変更して終了を押下する。


プロジェクトタブのTodoListを右クリックして、実行構成にて
プロジェクトURL:http://localhost/TodoList1/web
開始ファイル:index.php
を入力する。


サービスタブのデータベースを右クリックして、「MySQLサーバーを登録」を選択。


サービスタブのデータベースを右クリックして、「新規接続」を選択。
ドライバにMySQL(Connector/J driver)を選択。



XAMPP その2

XAMPPコントロールパネルのShellボタンを押して、コマンドプロンプトを開く


コマンドプロンプト

#> mysql
mysql> CREATE DATABASE todolist;
mysql> CREATE USER 'todolist'@'localhost' IDENTIFIED BY 'todolist';
mysql> USE todolist;
mysql> GRANT ALL ON todo TO 'todolist'@'localhost';



NetBeans その2

プロジェクトタブのdb > mysql.sqlマイグレーションファイル)を開く
「新規接続」ボタンで作成した接続(ポートが3306のもの)を選択する
文の実行ボタンを押下する(create table, insert が実行される)



ここまでで準備は完了です。
ツールバーの緑の矢印ボタンを押下するとアプリが実行されます。

OpsWorksでのRailsアプリのデプロイ手順(2)

OpsWorksでのStack、アプリケーションサーバーレイヤーの作り方については前の記事を参照してください。
http://d.hatena.ne.jp/seika_m/20150911


Railsアプリを用意します。
 ※参考 MacでのRuby開発環境の構築手順 http://d.hatena.ne.jp/seika_m/20150713
 ※参考 DB(SQLite3)を使うシンプルなRailsアプリの作り方 http://d.hatena.ne.jp/seika_m/20150912


それとGitHub のアカウントを用意してください。
https://github.com/
 ※参考 GitHubの使い方 http://d.hatena.ne.jp/seika_m/20150906


Gemfileには以下のGemが必要です。
gem 'therubyracer', platforms: :ruby
gem 'unicorn'
gem 'mysql2', '~> 0.3.16'


※はまりポイント1
これら3つのgemファイルが無い場合、デプロイに失敗します。



AWSにログインします。
OpsWork の Layers を選択します。そして、

  1. Layer を選択します。



Layer type にMySQL を選択します。
passwordが自動的に表示されるのでメモ帳などに保存します。
Add Layerボタンを押下します。


MySQL レイヤーが追加されました。
次にAdd instance を選択します。



そのままAdd instance ボタンを押下します。



Start を選択してインスタンスを起動します。
インスタンスの起動するまで10分ぐらいかかります。他の画面に移動しても大丈夫です。)



次にAdd an app を選択します。



Name にアプリの名前を入力します
Data source type に OpsWorks を選択します
Database instance に先ほどのインスタンスを選択します
Database name にDBの名前を入力します。


※はまりポイント2
異なるアプリ(異なるRepository URLを参照するアプリ)を使う場合、
異なるName、異なるDatabase name を入力して下さい。そうしないとデプロイに失敗します。



画面をスクロールし、
Repository type に Git を選択します。
Repository URL にはアプリのGitHubのURLをセットします。ここでは
https://github.com/fumio-shimamura/railsbase2.git
をセットします。
Branch/Revision にはブランチ名をセットします。ここではmasterをセットします。
Enviroment Variables のKEY に SECRET_KEY_BASE
VALUE に任意の値をセットし、Protected value のチェックを入れます。
(KEYの値は config/secrets.yml の中にある値を指しています。)
VALUEの値は rake secret で生成した値などを入力します。)
Save ボタンを押下します。



Deployを選択します。



Migrate database を Yes にします。
Deploy ボタンを押下します。
(Deploy 完了までは数分かかります。)



Instances のページの Public IP を選択します。



起動した事を確認できます。




以上です。




補足1:
はまりポイント1、2について


以下のようなエラーメッセージが表示されます。

Error executing action `deploy` on resource 'deploy[/srv/www/myapp]'

(中略)

INFO: Running queued delayed notifications before re-raising exception
ERROR: Running exception handlers
ERROR: Exception handlers complete

補足2:
rails new しただけのアプリをデプロイした場合、デプロイは成功しますがページには
We're sorry, but something went wrong.
が表示されてしまします。
アプリのpublicフォルダ(favicon.icoが入っているフォルダ)にindex.htmlを追加してください。

DB(SQLite3)を使うシンプルなRailsアプリの作り方

アプリ作成用のフォルダ(/Users/ユーザー名/Documents など)でrails new します。

$ cd /Users/ユーザー名/Documents 
$ rails new アプリ名


アプリ名はここではraislbase2とします。
rails new railsbase2)


raislbase2/Gemfile を開き、以下を変更します。
(※これはAWS OpsWorksを使用する際には必要な設定ですが、その他の環境の場合は不要です。)
gem 'therubyracer', platforms: :ruby
gem 'unicorn'
コメントアウトする(有効にする)。


gem 'mysql2', '~> 0.3.16'
を追加する。




続いて、以下コマンドを入力します

$ cd railsbase2
$ bundle install 
$ rails generate controller Messages index
$ rails generate model Message name:string body:string
$ rake db:migrate


raislbase2/config/routes.rb を開き、以下のようにします。

Rails.application.routes.draw do
  #get 'messages/index'
  root 'messages#index'
  resources :messages , only: [:create]
end


railsbase2/app/controllers/messages_controller.rb を開き、以下のようにします。

class MessagesController < ApplicationController
  def index
    @messages = Message.all
  end

  def create
    @message = Message.new(message_params)
    @message.save
    redirect_to root_path , notice: 'メッセージを保存しました'
  end

  private
  def message_params
    # params[:message]のパラメータで name , bodyのみを許可する。
    # 返り値は ex:) {name: "入力されたname" , body: "入力されたbody" }
    params.require(:message).permit(:name, :body)
  end
end


railsbase2/app/views/messages を開き、以下のようにします。

<h1>メッセージ一覧</h1>
<% @messages.each do |message| %>
  名前:<%= message.name %>
  内容:<%= message.body %>
  <br>
<% end %>

<%= form_for(Message.new) do |f| %>
  名前:
  <%= f.text_field :name %>

  内容:
  <%= f.text_field :body %>
  <%= f.submit %>
<% end %>

以下のコマンドでアプリを起動し、http://localhost:3000/ にて動いていることを確認します。

$ rails s



以上です。
完成した物はこちらになります。
https://github.com/fumio-shimamura/railsbase2