【お知らせ】まとめて検索などの提供終了

Apache上のWEBサイトを通常のサイトからメンテナンス中へ切り替える

tomcat を再起動

tomcatの起動を確認後

Apache上のWEBサイトをメンテナンス中から通常サイトへ切り替え

これを全て時間を指定して(例えばAM4:00に)自動で行いたいのですが、何か方法はありますでしょうか?
OSは、Cent OSです。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

おっと、それは失礼しました。


Apacheの設定ファイル内の変更は、sed/awk/perlあたりで一行を無理矢理書き換えるとか、RCSを使ってリビジョンコントロールするとか、あるいは単にmvするとか、手段自体は色々あるかと思います。

ただ、エンタープライズレベルでエラーページを出す場合は、通常、負荷分散装置でやりますね。
OSSでどこまで出来るかは私も認識していないのですが、PoundやUltraMonkey-L7について調べてみると、そういった機能が見つかるかも知れません。
あるいは、Reverse Proxyを置けばその問題を軽減できるかも。

単純に、設定変更してGraceful Restartでも、それほど大きくないサイトなら困らないと思いますが、本当に止められないのであればそういったことが考えられます。
5秒程度新規アクセスが切れたとしても、メンテナンス前後のことであれば、ユーザの利便性やストレスはそんなに悪化しないと思いますけどね…。
    • good
    • 0
この回答へのお礼

beefisdead様
ご回答ありがとうございます。

様々なヒントをいただきましたので、当方に最適な方法を探りたいと思います。
新しく何か(ソフト的にもハード的にも)導入する、という事が難しそうですので、できるだけ単純な方法を取りたいとは思っています。

サーバーは評価段階のプログラムが動いており、アクセスに関してはクリティカルな問題はありません。
現在メモリを異様に食いつぶしている感があり、時間が経つとレスポンスが悪くなっています。
ただ、一部業務上使用しているWEBサイトがあり、日中メンテナンスができないということで、今回の方法(夜中に自動再起動)を取れないか、ということになりました。
また、夜中でも全くアクセスが無い訳ではありませんので、念のためメンテナンス中のページを出した上で再起動をしよう、ということなのです。

お礼日時:2011/07/05 10:42

スクリプト作ってcronで動かす。

以上。

しかしWebサイトを毎日メンテナンスに入れるというのはちょっと筋が良くないですね。
それに、自動で再起動するのもかなり怖い。お客様がいるまともなサイトなら、責任持って再起動を見張るか、再起動失敗したときにアラートが人間に飛んで対応できるようにする必要があります。

なお、「tomcat起動後」という動作は、シェルスクリプトの&&で繋ぐ方が正当ですが、どうせエラーが起きたら人力対応が必要なので、単純な逐次実行でも大差ないでしょう。
    • good
    • 0
この回答へのお礼

beefisdeadさま
ご回答ありがとうございます。

> スクリプト作ってcronで動かす。以上。

それはそうなのですが、単純にtomcatを再起動するだけではなく、問題はApacheだと思うので、そちらの処理をどうすればいいかお知恵をお貸しいただければと思い、投稿いたしました。

1.Apacheのルートディレクトリを一時的に変更して
2.tomcatを再起動
3.一定時間後Apacheのルートディレクトリを元に戻す

というのが思いつく限りの方法ですが、1.と3.をスクリプトで処理するとしたら、どういう記述になるのでしょうか?

お礼日時:2011/07/04 10:15

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q定期的にTomcatを再起動する意味

上司から、「定期的に、たとえば1週間に1度、Tomcatを再起動したほうが、システムが安定すると思うがどうだろう?」と言われ、返答できなかったので、教えていただきたいと思います。

Tomcatを再起動すると、セッション情報やコネクションプールが初期化されるので、システムの不具合により出されたゴミを消すことができます。

しかし、無意味なことはやりたくありません。

説明できる方、よろしくお願いします。
また、参考になるサイトがありましたらご紹介ください。

Aベストアンサー

或るプロジェクトでまさにそれを数年間やってました。
場当たり的な対症療法だと言われれば、その通りなのですが・・・。

おっしゃる通り、メモリリーク、コネクションリークを始めとする、システム内に生じた不正な状態をリセットして、安定化させるのが目的でした。(「なんとか稼動させる」と言った方が適切かも知れませんね・・・)

一般的には、不安定で有る事、根本的な解決がすぐに出来ない事が分かるまでは、安易にやるべきでは無いと思います。
安定性に不安が有るのでしたら、まずはシステムの監視を強化して、トラブルが発生したら即座に対応すべきかと。


冒頭に挙げたプロジェクトの場合は、不安定な状態が続いており、初期開発者の退職によりシステム全体を把握している人間が居らず、根本的な修正を行う予算も取れなかったのが理由でした。再起動をやり続けたおかげで、ユーザがいない時間を見計らって再起動させるノウハウ・ツールなどが整備されるという、嬉しいのだか悲しいのだか分からない副作用も有りました。
その後、数年掛けて、プロジェクトメンバーが片手間で不安定要因を取り除き、やっと再起動を不要にしました。

安定化に掛かるコストは見積りづらく、再起動で済むならそれが一番安上がりだという事になりがちですが、定期的な再起動は不安定性を除去するのではなく緩和するだけなので、応急処置だと割り切った方が良いと思います。

参考URL:http://www.atmarkit.co.jp/fjava/index/index_troublehacks.html

或るプロジェクトでまさにそれを数年間やってました。
場当たり的な対症療法だと言われれば、その通りなのですが・・・。

おっしゃる通り、メモリリーク、コネクションリークを始めとする、システム内に生じた不正な状態をリセットして、安定化させるのが目的でした。(「なんとか稼動させる」と言った方が適切かも知れませんね・・・)

一般的には、不安定で有る事、根本的な解決がすぐに出来ない事が分かるまでは、安易にやるべきでは無いと思います。
安定性に不安が有るのでしたら、まずはシステムの監視を強...続きを読む

Qapache停止してたら再起動させるcron

apache停止してたら再起動させるcron

アパッチ停止時してたら再起動させるcronを設定したいのですが、cronに以下を設定してもうまくいきません。
set http=`ps aux | grep -v grep | grep -c http` ; if ( $http < 2 ) /usr/local/sbin/restart_apache

cronエラーとしてマスターユーザに以下エラーが来ます。
Syntax error: word unexpected (expecting "then")

シェルがX-Cron-Env: <SHELL=/bin/sh>であるという記述もありcron実行時にはshを使う?
ようなのですが。。。ググっても解決できずにいます!

thenとendifを入れてもだめです。
おそらく1行で実行する構文?がよくないのだと思っています。
セミコロン;とかを入れてみてもうまくいきませんでした。

どなたかおわかりでしょうか

Aベストアンサー

http=`ps aux | grep -v grep | grep -c http` ; echo $http |mail -s test root ; fi
uが余計ですね。
http=`ps ax | grep -v grep | grep -c http` ; echo $http
を使ってみてはいかがでしょうか?
auxになっていると行の長さが長すぎるためにhttpにマッチできません。

あと、crontabはSHELL=の値を見てもわかるとおり、デフォルトでsh (bshのこと) です。
cshの構文は使えません。
...というか、普通シェルスクリプトはcshでは書きません。
たしかに、BSD系OSのrootのシェルはcshですし、FreeBSDなんかtcshだったりしますが、それでもスクリプトは基本shで書きます。
あと、リスタートするのも/usr/local/etc/rc.d/apache22 restartとかではダメなんでしょうか? (スクリプトの正確な名前や位置はApacheのバージョン及びOSによって変わります)

最後に、BSD系OSもいろいろあるのでOS名とバージョンがあった方が答えやすいと思います。

http=`ps aux | grep -v grep | grep -c http` ; echo $http |mail -s test root ; fi
uが余計ですね。
http=`ps ax | grep -v grep | grep -c http` ; echo $http
を使ってみてはいかがでしょうか?
auxになっていると行の長さが長すぎるためにhttpにマッチできません。

あと、crontabはSHELL=の値を見てもわかるとおり、デフォルトでsh (bshのこと) です。
cshの構文は使えません。
...というか、普通シェルスクリプトはcshでは書きません。
たしかに、BSD系OSのrootのシェルはcshですし、FreeBSDなんかtcshだ...続きを読む

QリンクでPOSTデータを送信することは可能ですか?

はじめまして。
Submitボタンを使用せずに<A>リンクでFORMのPOSTメソッドデータを送信することは可能でしょうか?
やはりURLにデータを付加して送信するしかないのでしょうか?
ご教授よろしくお願い致します。

Aベストアンサー

javascript を使えば可能です。大雑把にはこんな感じ。

・パラメータが全部 hidden な form を記述しておく(ブラウザでは表示されない)
・<a href> では、その form を submit するように javascript を記述する

試してないですけど、こんな感じ。

<form name=f method=POST action="http://どこか">
<input type=hidden name=x1 value=v1>
</form>

<a href="javascript:document.f.submit()">リンクから submit</a>

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。

QEclipseでのJDBCドライバについて

Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか?
またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか?

ご存知の方教えてください、よろしくお願いします。

Aベストアンサー

WEB-INF以下に入れると実行はできるのですが、エクリプスが.javaファイルをコンパイルすることができません。projectの一覧を右クリックしてpropertyを選択し、ダイアログ右側からJava Build Pathを選択し、タグからLibrariesを選び、Add JARsボタンをおして.jarファイルを登録して下さい。
たぶんこれでコンパイルできるはずです。

QTomcatのメモリー使用量が知りたい

Tomcatに割り当てられているメモリーの
総容量や現在使用中の容量、空き容量を知りたいのですが
それらを知る方法はあるのでしょうか?

Aベストアンサー

Runtime.getRuntime().totalMemory()
割当メモリーが分かります。
Runtime.getRuntime().freeMemory()
空きメモリーが分かります。

Q実行時のNoClassDefFoundErrorが解決できません

Windows で コマンドプロンプトから Java のプログラム実行時に
NoClassDefFoundError が発生する問題で
Web 等を参考にいろいろ対処してみたのですが、
どうしても解決しないでいます。

JDK, JRE は 1.6.0_01 を以下にインストールしており、
C:\Program Files\Java\jdk1.6.0_01
C:\Program Files\Java\jre1.6.0_01

C:\Program Files\Java\jdk1.6.0_01\bin にPATHを通しています。
CLASSPATH 環境変数は設定していません。
その上で、以下のことをやりました。

(1) HelloWorld.java というファイルを D:\test フォルダに作成する。
  内容は以下の通り。

HelloWorld.java
-------------------------------------------------------------------------------
package testpackage;

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
-------------------------------------------------------------------------------

(2) コマンドプロンプトで D:\test に移動し、以下を実行する。

javac HelloWorld.java
(正常終了し、HelloWorld.class が D:\test に作成されたことを確認)

(3) 引き続きコマンドプロンプトで、以下を実行する。(例外が発生)

java HelloWorld
-------------------------------------------------------------------------------
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong nam
e: testpackage/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
-------------------------------------------------------------------------------

Web の情報を参考に

java -cp . HelloWorld
java -cp D:\test HelloWorld

も実行してみましたが、同様の結果でした。

(4) 試しに以下も実行してみました。

javap HelloWorld
-------------------------------------------------------------------------------
Compiled from "HelloWorld.java"
public class testpackage.HelloWorld extends java.lang.Object{
public testpackage.HelloWorld();
public static void main(java.lang.String[]);
}
-------------------------------------------------------------------------------


以上です。
これ以上の対処方法が全く思い当たらない状態なのですが、
原因のわかる方がいらっしゃいましたらお願いします。

Windows で コマンドプロンプトから Java のプログラム実行時に
NoClassDefFoundError が発生する問題で
Web 等を参考にいろいろ対処してみたのですが、
どうしても解決しないでいます。

JDK, JRE は 1.6.0_01 を以下にインストールしており、
C:\Program Files\Java\jdk1.6.0_01
C:\Program Files\Java\jre1.6.0_01

C:\Program Files\Java\jdk1.6.0_01\bin にPATHを通しています。
CLASSPATH 環境変数は設定していません。
その上で、以下のことをやりました。

(1) HelloWorld.java というファ...続きを読む

Aベストアンサー

Javaのクラスファイルは、packageの階層と同じディレクトリ構造にしないといけません。

質問者さんの例なら、D:\testの下にtestpackageというディレクトリを作り、
その中にコンパイルしたHelloWorld.classを入れます。
そして、D:\test からコマンドプロンプトで

java testpackage.HelloWorld
もしくは
java testpackage/HelloWorld

で起動できます。

QSystem.exit()の値を取得したい

 今日は、JAVA初心者です、宜しくお願いします。

 プログラムの終了時の結果を System.exit()で取得したいのですが、どのようなメソッドが
あるのでしょうか。

 宜しくお願いします。

Aベストアンサー

System.exit()で何かを取得することはできません。
「System.exit()の値を取得したい」だったら、Windowsではこんな感じ。引数の数をそのままプログラムの終了コードにしています。

public class SysExit {
public static void main(String[] args) {
System.exit(args.length);
}
}

>java SysExit
>echo %ERRORLEVEL%
0

>java SysExit 1 2 3
>echo %ERRORLEVEL%
3

QApacheのバージョンアップ方法

現在Apacheのバージョンが2.2.15です。現在最新の2.2.22にバージョンアップをしたいです。
OSはCentOS6です。
Linux系の操作は初めで、インストールまでは完了しております。
バージョンアップの方法が分かりません。
教えていただけますでしょうか。

因みにウェブで検索したのですが、下記の方法で間違いないでしょうか?
もし間違いがあればご指摘頂けないでしょうか。
以下の方法は実際はインストール手順の方でしょうか?

(1)httpd.confファイルのバックアップ。
(2)Apacheを停止
  #/usr/bin/apachectl stop
(2)最新のバージョンをダウンロード。
#wget http://www.apache.org/dist/httpd/httpd-2.2.22.tar.gz
(3)展開する。
#tar zxvf ./httpd-2.2.22.tar.gz
(4)ダウンロードしたディレクトリへ移動 
 #cd httpd-2.2.22
(5)設定(ソースツリー設定?)
#./configure --prefix=/etc/httpd
(6)ビルド
 #make
(7)インストール
 #make install
(8)設定ファイルのカスタマイズ
 #vi /etc/httpd/conf/httpd.confでバックアップしたものの内容に修正?
(9)Apacheを開始
  #/usr/bin/apachectl start

バージョンアップ方法については以下の手順だけと書いてあるサイトがあったのですが、
config.niceやconfig.statusというのが見つかりませんでした。

# ./config.nice
# make
# make install
# usr/bin/apachectl stop
# usr/bin/apachectl start
 



 

現在Apacheのバージョンが2.2.15です。現在最新の2.2.22にバージョンアップをしたいです。
OSはCentOS6です。
Linux系の操作は初めで、インストールまでは完了しております。
バージョンアップの方法が分かりません。
教えていただけますでしょうか。

因みにウェブで検索したのですが、下記の方法で間違いないでしょうか?
もし間違いがあればご指摘頂けないでしょうか。
以下の方法は実際はインストール手順の方でしょうか?

(1)httpd.confファイルのバックアップ。
(2)Apacheを停止
  #/usr/bin/apachectl st...続きを読む

Aベストアンサー

次の質問を見ましたが、あなたのスキルレベルだと、ソースからのインストールは止めた方が良いです。
yum コマンドでアップデートするだけにしましょう。

どうしてもと言うなら、/usr/local にインストールしてください。./configure --prefix=/usr/local
OS附属のものは削除した方が良いでしょう。yum remove httpd で。

次の質問のエラーメッセージ(簡単な英語ですが)を見るとcコンパイラが入ってないのでそのインストールも必要です。yum install gcc

http://httpd.apache.org/docs/2.2/ja/install.html

をよく読んでください。また tar に含まれている INSTALL というファイルも読んでください。

configureでエラーになればライブラリが不足しているのでエラーメッセージをよく見て必要なライブラリを yum install してください。

Q文字列を日付に変換でParseException

文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06" 
 at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。

実際のコーディングは
Date sgndate = new Date();
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
                              lstdaysgn.substring(8,10);
sgndate = DateFormat.getDateInstance().parse(lstdaysgn); ・・・・・・・・・ここでエラー発生
}

どこが悪いのか解りません。
よろしくご教授ください。

文字列を日付に変換するところで、「ParseException: Unparseable date: "2013/08/06" 
 at java.text.DateFormat.parse(DateFormat.java:335) 」とエラー表示されました。

実際のコーディングは
Date sgndate = new Date();
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
                              lstdaysgn.substring(...続きを読む

Aベストアンサー

どこが悪いって
DateFormat.getDateInstance().parse(lstdaysgn);
が悪い。実際エラーはそこで起こってるんだし。で、そこの部分について手直しよりも一つ提案があるので聞いてみてくれたまい。

仮にrsがデータベースからSELECT文でデータを取ってきた時のレコードセットであり、かつrs.getString("sgnymd")がyyyyMMdd形式の(スラッシュが付かない)8桁の数字文字列であり、かつ単純にその日付でDate型にしたいだけなのであればこうしたらいいんじゃないか。

Date sgndate = null; // new Date()しない。もちろん後続のルーチンでnullチェックは要るようになる。
if(!StringUtil.isNull(rs.getString("sgnymd"))){
String lstdaysgn = rs.getString("sgnymd");
// ↓これもしない。
// lstdaysgn = lstdaysgn.substring(0,4) + "/" + lstdaysgn.substring(5,7) + "/" +
//                              lstdaysgn.substring(8,10);
sgndate = new SimpleDateFormat("yyyyMMdd").parse(lstdaysgn); // スラッシュつけずに8桁のyyyyMMddでそのままDateにする。
}

以上の手直しにより、このルーチンを通る際にDate 1つとString 7つ、インスタンスの生成を回避する事ができる。これがループで処理されるならなおさら。
仮に、「new SimpleDateFormat("yyyyMMdd")だとパースのたびにSimpleDateFormatのインスタンスが作られちゃうジャン!」と思うならルーチン化していいと思うけど、その場合はスレッドセーフなルーチンにしないといけないのでそこらへん注意の事。

どこが悪いって
DateFormat.getDateInstance().parse(lstdaysgn);
が悪い。実際エラーはそこで起こってるんだし。で、そこの部分について手直しよりも一つ提案があるので聞いてみてくれたまい。

仮にrsがデータベースからSELECT文でデータを取ってきた時のレコードセットであり、かつrs.getString("sgnymd")がyyyyMMdd形式の(スラッシュが付かない)8桁の数字文字列であり、かつ単純にその日付でDate型にしたいだけなのであればこうしたらいいんじゃないか。

Date sgndate = null; // new Date()しない。もちろ...続きを読む


人気Q&Aランキング