GlassFish4でSpringBootを動かすとログが無限に出力される対処方法
GlassFish4でSpringBootアプリを動かすと、アプリで設定したログファイルに無限にログが出力され、サーバーのディスクを使い切るという現象に遭遇しました。
いろいろ調べてもなかなか対処方法がありませんでしたが、困った時の「stack overflow」に似たようなことで質問が上がっていたので試したら無事解決したので、その手順を紹介します。
動作環境
SpringBoot | 1.3.6 |
---|---|
Logback | 1.1.7 |
SLF4j | 1.7.21 |
GlassFish | 4.1.1 Full Profile |
※GlassFishは、PayaraServer 163 Fullのdomain1を使用
問題の現象
GlassFishにSpringBootアプリをwarでデプロイし、アプリが起動するとアプリで設定したログファイルに次のようなものが無限に出力される。
INFO [2016-11-08 16:59:28.375] unknown.jul.logger . ____ _ __ _ _ INFO [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ INFO [2016-11-08 16:59:28.397] unknown.jul.logger ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ INFO [2016-11-08 16:59:28.397] unknown.jul.logger \\/ ___)| |_)| | | | | || (_| | ) ) ) ) INFO [2016-11-08 16:59:28.397] unknown.jul.logger ' |____| .__|_| |_|_| |_\__, | / / / / INFO [2016-11-08 16:59:28.398] unknown.jul.logger =========|_|==============|___/=/_/_/_/ INFO [2016-11-08 16:59:28.398] unknown.jul.logger :: Spring Boot :: (v1.3.6.RELEASE) INFO [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.375 INFO 2466 --- [ Thread-8] unknown.jul.logger : . ____ _ __ _ _ INFO [2016-11-08 16:59:28.398] unknown.jul.logger INFO [2016-11-08 16:59:28.375] unknown.jul.logger . ____ _ __ _ _ INFO [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ INFO [2016-11-08 16:59:28.398] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ INFO [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ INFO [2016-11-08 16:59:28.399] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ INFO [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : \\/ ___)| |_)| | | | | || (_| | ) ) ) ) INFO [2016-11-08 16:59:28.399] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger \\/ ___)| |_)| | | | | || (_| | ) ) ) ) INFO [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : ' |____| .__|_| |_|_| |_\__, | / / / / INFO [2016-11-08 16:59:28.400] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger ' |____| .__|_| |_|_| |_\__, | / / / / INFO [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : =========|_|==============|___/=/_/_/_/ INFO [2016-11-08 16:59:28.400] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger =========|_|==============|___/=/_/_/_/ INFO [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : :: Spring Boot :: (v1.3.6.RELEASE) INFO [2016-11-08 16:59:28.400] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger :: Spring Boot :: (v1.3.6.RELEASE) INFO [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : 2016-11-08 16:59:28.375 INFO 2466 --- [ Thread-8] unknown.jul.logger : . ____ _ __ _ _ INFO [2016-11-08 16:59:28.401] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.375 INFO 2466 --- [ Thread-8] unknown.jul.logger : . ____ _ __ _ _ INFO [2016-11-08 16:59:28.401] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : INFO [2016-11-08 16:59:28.375] unknown.jul.logger . ____ _ __ _ _ INFO [2016-11-08 16:59:28.401] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger INFO [2016-11-08 16:59:28.375] unknown.jul.logger . ____ _ __ _ _ INFO [2016-11-08 16:59:28.401] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ INFO [2016-11-08 16:59:28.401] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ INFO [2016-11-08 16:59:28.402] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : INFO [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ INFO [2016-11-08 16:59:28.402] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ INFO [2016-11-08 16:59:28.402] unknown.jul.logger 2016-11-08 16:59:28.399 INFO 2466 --- [ Thread-8] unknown.jul.logger : 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ INFO [2016-11-08 16:59:28.402] unknown.jul.logger INFO [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
GlassFishでLoggerが認識されていないのが原因のようです。
手順
GlassFishにあるファイルを編集する前にバックアップを取りましょう。
1.GlassFishが起動している場合、停止する
glassfish4/glassfish/bin/asadmin stop-domain domain1
2.GlassFIshのlibディレクトリにlogback・slf4jライブラリを配置する
# 配置先 glassfish4/glassfish/lib/endorsed # 配置するライブラリ jul-to-slf4j-x.x.x.jar slf4j-api-x.x.x.jar logback-core-x.x.x.jar logback-classic-x.x.x.jar
3.GlassFishのconfigディレクトリにlogback.xmlを配置し、次のように定義する
vi glassfish/domains/domain1/config/logback.xml
<configuration debug="true" scan="true"> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>log/server.log</file> <append>true</append> <encoder> <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{52} - %msg%n</Pattern> </encoder> </appender> <root> <level value="INFO"/> <appender-ref ref="FILE"/> </root> </configuration>
4.GlassFishにある「logging.properties」の一部を書き換える
管理コンソールで変更している場合、変更した値になっているので注意して下さい。
vi glassfish4/glassfish/domain1/config/logging.properties
Before
handlers=java.util.logging.ConsoleHandler handlerServices=com.sun.enterprise.server.logging.GFFileHandler java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0 com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1 java.util.logging.FileHandler.limit=50000 com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000 com.sun.enterprise.server.logging.GFFileHandler.excludeFields= com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false java.util.logging.FileHandler.count=1 com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0 log4j.logger.org.hibernate.validator.util.Version=warn com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0 com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false java.util.logging.FileHandler.pattern=%h/java%u.log java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter
After
handlers=org.slf4j.bridge.SLF4JBridgeHandler #変更 handlerServices=com.sun.enterprise.server.logging.GFFileHandler java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log #そのまま com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0 com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1 java.util.logging.FileHandler.limit=50000 com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000 com.sun.enterprise.server.logging.GFFileHandler.excludeFields= com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false java.util.logging.FileHandler.count=1 com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0 log4j.logger.org.hibernate.validator.util.Version=warn com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0 com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false java.util.logging.FileHandler.pattern=%h/java%u.log com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter #変更 com.sun.enterprise.server.logging.GFFileHandler.alarms=false #追加
5.GlassFishの「domain.xml」にJVMオプションを追加する
vi glassfish4/glassfish/domains/domain1/config/domain.xml
domain.xml
# <domain> # <configs> # <config name="server-config"> # <java-config> 配下に追加する(250行目の次) <jvm-options>-Djava.util.logging.config.file=${com.sun.aas.instanceRoot}/config/logging.properties</jvm-options> <jvm-options>-Dlogback.configurationFile=file:///${com.sun.aas.instanceRoot}/config/logback.xml</jvm-options>
6.GlassFishを起動する
glassfish4/glassfish/bin/asadmin start-domain domain1
補足
SpringBootアプリには、「jul-to-slf4j」は含んでいません。
logback.xmlは、SpringBootのbase.xmlを読み込み、独自設定を追加しています。
application.propertiesの「logging.file」は、設定していません。
logging.properties(alarms以外)、jvm-optionは、管理コンソールの「server-config」で設定できます。
まとめ
ネットにあった内容をそのまま試して日本語に起こしただけです。
詳しいことは分からないので聞かないようにお願いしますw
この記事で関連する書籍
Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築
- 作者: 寺田佳央,猪瀬淳,加藤田益嗣,羽生田恒永,梶浦美咲,小田圭二
- 出版社/メーカー: 翔泳社
- 発売日: 2015/12/16
- メディア: 大型本
- この商品を含むブログ (7件) を見る
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者: 株式会社NTTデータ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/20
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
XamarinをMacにインストールする
スマホアプリをクロスプラットフォーム開発できる「Xamarin」をMacにインストールしたときの手順です。
手順
1.Xamarinダウンロードページにアクセスします。
www.xamarin.com
2.全項目を入力し、チェックボックスにチェックを入れ、ダウンロードボタンをクリックします。
3.「XamarinInstaller.dmg」のダウンロードが開始されます。
4.ダウンロードが完了したら、dmgファイルを実行し、表示されたアイコンをダブルクリックします。
5.Webからダウンロードしたので「開く」をクリックします。
6.「同意する」にチェックします。
7.インストールの準備中でしばらく待ちます。
8.インストールするプロダクトを選択します。
9.設定のインストール先を設定します。
10.XCodeがインストールされていない場合のお知らせです。
11.インストールされるプロダクトの一覧です。
13.Macのパスワードを入力します。
14.インストールが開始されるので待ちます。
15.インストールの進捗バーがなくなりますが、インストール中で、3回程Macのパスワードが求められるので入力します。
16.インストールが完了しました。XCodeがインストールされていな場合、「インストールしてね」と表示されます。
17.アプリケーションフォルダの「Xamarin Studio.app」を起動します
登録後に届くメール
以下の様なメールが届きます。
最終行に配信停止のリンクがあるので不要であればそこから手続きします。
Hi
Thanks for downloading Xamarin Studio! We just wanted to point you to a few key resources to help you get started quickly:
- Cross-platform development with Xamarin Studio
- Prebuilt Apps
- Xamarin Developer Center
If you have any questions, please post them here in StackOverflow and our support team will answer them as quickly as they can.
Warm regards,
Unsubscribe from Xamarin marketing emails.
Team Xamarin
「doma-spring-boot-starter」を使ってSpringBootとDomaの連携を楽にする
JavaのDBアクセスフレームワーク「Doma2」にSpringBootと連携し自動で設定してくれる「doma-spring-boot-starter」が追加されました。
今までは独自にDoma用のクラスを作成し連携していましたが、それをする必要がなくなり導入と設定が楽になりました。
「doma-spring-boot-starter」の適用概略
1.build.gradleに「https://oss.sonatype.org/content/repositories/snapshots」のリポジトリを追加する
2.build.gradleに「org.seasar.doma.boot:doma-spring-boot-starter」の依存を追加する
3.application.propertiesに必要であればdoma用の設定を追加する
「doma-spring-boot-starter」を使うことでdoma設定クラスが不要になります。
application.properties
にdoma.naming
を追加することで、@Entity
のNamingType
の定義が不要になります。
サンプルコード
build.gradle
repositories { mavenCentral() // 追記 maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } } dependencies { // 追記 compile('org.seasar.doma.boot:doma-spring-boot-starter:1.0.2') // 削除 //compile('org.seasar.doma:doma:2.6.2') }
src/main/resources/application.properties
# DB spring.datasource.url=jdbc:oracle:thin:@localhost:1521:test_db spring.datasource.username=test spring.datasource.password=test spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver # DOMA doma.dialect=ORACLE doma.naming=SNAKE_LOWER_CASE
src/main/java/com.example.dao.EmpDao
package com.example.dao; import java.util.List; import org.seasar.doma.Dao; import org.seasar.doma.Select; import org.seasar.doma.boot.ConfigAutowireable; import com.example.entity.Emp; @ConfigAutowireable @Dao public interface EmpDao { @Select List<Emp> findAll(); }
src/main/java/com.example.entity.Emp
package com.example.entity; import java.util.Date; import org.seasar.doma.Entity; import org.seasar.doma.Id; // application.propertiesの「doma.naming」で指定済みなので不要 //@Entity(naming = NamingType.SNAKE_LOWER_CASE) @Entity public class Emp { @Id public String empNo; public String empNm; }
src/main/java/com.example.web.TestController
package com.example.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.example.dao.EmpDao; import com.example.entity.Emp; @Controller public class TestController { @Autowired private EmpDao empDao; @RequestMapping("/test") public String index() { List<Emp> list = empDao.findAll(); for (Emp emp : list) { System.out.println(emp.empNo); } return "test/test"; }
さくらのレンタルサーバーでCodeigniterを使いHTTPアクセスをHTTPSに強制リダイレクトする.htaccessの書き方
さくらのレンタルサーバーでHTTPアクセスをHTTPSに強制リダイレクトするのにかなりハマりました。
ネットでひたすらHTTPSにリダイレクトする方法を調べ試してみましたが、リダイレクトループばかりで全く実現できず。
最終的にさくらの仕様のせいで通常の設定が効かないということが分かりました。
困っている方、コードをコピペしてさっさと解決してしまいましょう。
有効な「.htaccess」の設定
RewriteEngine On # HTTP->HTTPSリダイレクト設定 RewriteCond %{ENV:HTTPS} !^on$ RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # Codeigniterの設定 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L]
さくらの共有SSL、独自SSLとも上記設定でHTTPSリダイレクトが可能です。
%{ENV:HTTPS}と%{HTTP:X-SAKURA-FORWARDED-FOR}がミソです。
次のサイトで詳しく説明があり大変助かりました。
furyu.hatenablog.com
上記サイトより引用です。
%{SERVER_PORT} には、SSLかそうでないかによらず '80' が設定される。
このため、%{SERVER_PORT}ではSSL接続かどうかの判別はできない。
「RewriteCond %{SERVER_PORT} ^80$」や「RewriteCond %{SERVER_PORT} !^443$」は常に真となるために、リダイレクトループが発生してしまう。
SSLアクセス時には通常、 %{ENV:HTTPS} には 'on' が、%{HTTP:X-Sakura-Forwarded-For} にはクライアント(リクエスト元)のIPアドレスが設定される。*1
ただし、SSLアクセスした場合であっても、mod_rewrite.c の RewriteRule によりリライトされるケースでは、リライト後には %{ENV:HTTPS} が未設定となってしまう。
RewriteRuleの[R]フラグによりhttps://〜にリダイレクトされた場合には 'on' が設定される。
まとめ
さくらのレンタルサーバーでは独自仕様があるのでまずそれを確認すること。
Codeigniterで他にフックを使った方法があるが、この仕様を考慮したPHPコードを書く必要がある。
めんどくさいと思ったら.htaccessで設定した方が簡単!
サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)
- 作者: 鶴長鎮一
- 出版社/メーカー: 技術評論社
- 発売日: 2012/03/23
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 109回
- この商品を含むブログ (14件) を見る
さくらレンタルサーバーではRuby on Railsは動作するけどレスポンスが糞遅いのでやめとけ
タイトルの通りの内容で、さくらレンタルサーバーでRailsは糞遅いというお話です。
経緯
ホームページを作成する案件があって、それに付随するプログラムの開発がありました。
ホームページを動作させるのがメインだったので、レンタルサーバーが選択されました。
個人的にPHPが嫌い(Java育ちなのでPHPの曖昧さがなじめない)なのでそれ以外の言語はないのかとRubyを選択しました。
初めてのRuby on Railsでしたが、Java経験者からすると今までにない感じのプログラミングだったので、非常に楽しくワクワクしながら開発できました。
Ruby on Rails動作環境構築
さて、ひと通り出来上がったのでテストしてもらうために、動作環境であるレンタルサーバーにRuby on Railsが動作する環境を構築しました。
事前に動作するというのは確認できていたので、いろんなサイトを参考にしながら試行錯誤で環境を構築しました。
この時点で、レスポンスが遅いというのは情報として知ってました。
でも、本当に遅いのかというのがわからなかったのと、FCGIだと速いという情報もあったので大丈夫だろうと思ってました。
デプロイ
環境の構築も完了したのでデプロイしていました。
トップページにアクセスしてみると、なかなか画面が表示されません。
何度やっても遅い、遅い、遅い。
確か画面表示に10秒以上かかってたと思います。
「これはあかん」ということで、PHPで最初から作りなおしました…。
構築手順
かなり日にちが経っててよく覚えてませんが、当時のメモをそのまま載せておきます。ものすごく適当です。
お遊びで構築したい人向けです。間違っても本番運用しないで下さい。泣くのは開発者であるあなたです。
1.wwwディレクトリと同階層にappディレクトリを作成する
2.appディレクトリにRailsプロジェクトを配置する
RewriteEngine On RewriteRule ^$ index.html [QSA] RewriteRule ^([^.]+)$ $1.html [QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ dispatch.cgi [QSA,L] ErrorDocument 500 "Application errorRails application failed to start properly"
4.Rails/publicにdispatch.cgiを作成し、権限を755にする
#!/home/user/local/rbenv/versions/2.2.3/bin/ruby # 本番環境設定 ENV["RAILS_ENV"] = "production" # rake secretで生成したもの ENV["SECRET_KEY_BASE"] = "7cd8a5e38cfeddd0d0a4b45ad4bf75fd2cffe124f43388c34e6f29cf2c2e78f7d9cc1b2003f913be65c54f6ec61c7032609d3c9d88d6b3dc5226925a825b8379" # 静的ファイル ENV["RAILS_SERVE_STATIC_FILES"] = "true" require File.dirname(__FILE__) + '/../config/environment' class Rack::PathInfoRewriter def initialize(app) @app = app end def call(env) env.delete('SCRIPT_NAME') parts = env['REQUEST_URI'].split('?') env['PATH_INFO'] = parts[0] env['QUERY_STRING'] = parts[1].to_s env['PATH_INFO'] = env['PATH_INFO'].gsub(/\A#{ENV['RAILS_RELATIVE_URL_ROOT']}(.*)\Z/, '\1') env['SCRIPT_NAME'] = ENV['RAILS_RELATIVE_URL_ROOT'] @app.call(env) end end # アプリケーション名を設定する Rack::Handler::CGI.run Rack::PathInfoRewriter.new(Hoge::Application)
5.Rails/config/boot.rbに以下を追記する
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) $LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/2.2.0') $LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/site_ruby/2.2.0') $LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0') $LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib/ruby') $LOAD_PATH.push('/home/user/local/rbenv/versions/2.2.3/lib') ENV['PATH'] += ':/home/user/local/bin' ENV['GEM_HOME'] ||= '/home/user/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0' # パスを設定する ENV['RAILS_RELATIVE_URL_ROOT'] = '/hoge'
6.静的ファイルをプレコンパイルする
rake assets:precompile RAILS_ENV=production
7.node.jsを編集する
/local/src/node-v0.10.38/deps/v8/tools/gyp/v8.gyp
['OS=="freebsd"', { 'include_dirs+':[ '/home/user/local/include' ], 'link_settings': { 'libraries': [ '-L/usr/local/lib -L${HOME}/local/lib -lexecinfo', ]}, 'sources': [ '../../src/platform-freebsd.cc', '../../src/platform-posix.cc' ], } ],
FCGI対応
$ cd ~/local/src $ wget http://www.fastcgi.com/dist/fcgi.tar.gz $ tar xvzf fcgi.tar.gz $ cd fcgi-2.4.1-SNAP-0311112127 $ ./configure --prefix=$HOME/local CFLAGS="-g -O2 -Wall -fPIC" CXXFLAGS="-g -O2 -Wall -fPIC" $ make $ make install #### $ gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib $ cd ~/appdir $ bundle exec gem install fcgi -- --with-fcgi-include=$HOME/local/include --with-fcgi-lib=$HOME/local/lib $ vi Gemfile 追記 gem 'fcgi' $ bundle update
まとめ
さくらレンタルサーバーでは、Ruby on Railsは動作するが、レスポンスが糞遅いのでやめましょう。
レンタルサーバーというと全てのサーバーをイメージされると思いますが、root権限のない制約のあるレンタルサーバーのことです。
さくらのVPS等root権限のあるサーバーでは、普通に動作しますので勘違いされないようにお願いします。
開発時に参考にしたサイト
- rbenvでRubyを管理し、Rails開発環境を構築する | mae's blog
- Ruby の gem をプロジェクト毎に Bundler で管理する - fugafuga.write
- 【Mac】Ruby on Railsの環境構築とbundlerについて - TASK NOTES
- bundler経由でmysql gemを入れるときの--with-mysql-configの指定方法 - There's an echo in my head
- mysql - I can't run "bundle update" because of "mysql2" gem - Stack Overflow
- ruby on rails - Gem::LoadError for mysql2 gem, but it's already in Gemfile - Stack Overflow
Ruby on Rails 4 アプリケーションプログラミング
- 作者: 山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2014/04/11
- メディア: 大型本
- この商品を含むブログ (5件) を見る
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/31
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
- 作者: 高橋征義,後藤裕蔵,まつもとゆきひろ
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/26
- メディア: 単行本
- この商品を含むブログ (1件) を見る
さくらレンタルサーバーでPHPからベーシック認証を行うと入力値が取得できない対処方法
さくらレンタルサーバーでPHPでベーシック認証を実装し、対象のページにアクセスするとIDとパスワードを入力するダイアログが表示されます。
ここでID、パスワードを入力しても認証できない現象に遭遇し困ったので、その時の対処方法を説明します。
手順
Codeigniterの配下にある「.htaccess」を次のように編集します。
変更前
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L]
変更後
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L] RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
参考サイト
さくらレンタルサーバーにMercurialをインストールする
さくらのレンタルサーバーでMercurialをインストールした時の手順です。
1.ホームディレクトリ内に「local」ディレクトリを作成する
$ mkdir ~/local
2.ホームディレクトリ内に「tmp」ディレクトリを作成する
$ mkdir ~/tmp
3.Mercurialのソースを公式サイトよりダウンロードし、「tmp」ディレクトリに置き、解凍する
公式サイトでは、「Mercurial 3.7.2 source release」の記載欄にあるリンクからダウンロードします。
$ cd ~/tmp
$ wget http://mercurial.selenic.com/release/mercurial-3.7.2.tar.gz
$ tar xvzf mercurial-3.7.2.tar.gz
4.Mercurialをインストールする
さくらレンタルサーバーでは、Pythonがデフォルトでインストールされています。
$ cd mercurial-3.7.2 $ python setup.py install —home=$HOME/local —force
5.インストールされたか確認する
$ hg version Mercurial Distributed SCM (version 3.7.2) (see https://mercurial-scm.org for more information) Copyright (C) 2005-2016 Matt Mackall and others This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.