質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

5133閲覧

AWS EC2上のWebサーバーを起動したままにする方法を教えてください

rikarikarika

総合スコア1

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/06/27 13:30

前提・実現したいこと

購入した本に沿って、AWSを使ったWebアプリケーションを構築しています。
(サービス立ち上げなどではなく勉強中です。)
1.EC2にLinux 2 AMIでインスタンスを作成

2.自宅PCのwindows power shellにてSSHにて踏み台サーバーを経由して1のインスタンスにアクセス
ssh web01
==アクセスに使うconfig===
Host bastion
Hostname xxxxx.com
User ec2-user
IdentityFile C:\Users\xxx.ssh\xxx.pem

Host web01
Hostname web01.home
User ec2-user
IdentityFile C:\Users\xxx.ssh\xxx.pem
ProxyCommand ssh.exe bastion -W %h:%p

3.以下コマンドにてHTTPServerを起動
python -m SimpleHTTPServer 3000
※Hello Worldなindex.thmlを用意し、ブラウザから"Hello World"が返ってくることを確認

4.自宅PCのpower shellを閉じる、または自宅PCを放置してPCがスリープするとWebサーバがダウンしてしまう

発生している問題・エラーメッセージ

・ブラウザからアクセスした際のメッセージ
502 Bad Gateway

・スリープから復帰したPCのpower shell上のメッセージ
client_loop: send disconnect: Connection reset
client_loop: send disconnect: Unknown error

教えていただきたいこと

AWS上で動いているWebサーバが操作元である自宅PCのpower shellがダウンすることで一緒にダウンするのはなぜでしょうか?
また、自宅PCの電源状況によらずウェブサーバを動かし続けるにはどうしたらよいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

なぜそうなるかというと、SSHログインしたユーザのシェルで実行すると、シェルが終了した瞬間にそのシェルで実行していたプログラムが終了するからです。

それを避けるためには以下の方法があります。

  1. サービス化する

実際にやることは「ログインユーザのシェルではないところでプログラムを実行させる」といったイメージです。
apacheやnginx等々のミドルウェアも通常はサービスとして実行されています。
Amazon Linux2においてはSystemdを使ってサービス化するのが一般的です。
pythonのプログラムをsystemdを使ってサービスにする方法について書いてある記事を貼っておきます。
記事の細かいところは見てないので過不足あるかもしれません。
pythonスクリプトをdaemonにする[systemd編]
systemdでバックグラウンド動作するpythonスクリプトを作る
記事ではrestartなど色々定義してますが、最悪でもstart,stopぐらいあれば十分です。
また、Pythonのスクリプトである必要は特になく、Pythonを呼び出すシェルスクリプトでも問題ありません。
enableすることで、サーバ起動時にstartさせることも可能になります。
serviceコマンドを使ったものが調べると多数出てきますが、systemdよりも古いコマンドなのでそういった記事はあまり参考にしないほうが賢明です。
2. nohupでプログラムを実行する
nohupをつけてコマンド実行すると、端末を閉じたりログアウトしても処理を実行し続けさせられます。
nohup <コマンド> & といったように最後に&をつけてバックグラウンドで実行させることがほとんどです。
&をつけないとフォアグラウンドで実行させることになりますが、
そうすると実行中のプログラムが終了するまで入力を受け付けなくなってしまい、
シェルを終了させる方法がターミナルを強制終了するなどしかなくなるので、
実行したプログラムを動かしながら他のことをしたいときはバックグラウンドで実行しましょう。
【 nohup 】コマンド――端末を閉じてもログアウトしても処理を続ける
ちなみに、単にバックグラウンドで起動するだけだと、フォアグラウンドで実行したときと同様にシェルを終了した時にプログラムが終了されてしまいます。
3. バックグラウンドでプログラム実行させてdisownする
個人的にはほとんど使うことがないのであまり説明できませんが…。
先にプログラムを起動したものの、時間がかかるのでシェルが終了してもそのまま実行させ続けたい、などというときはdisownコマンドを使うこともできます。
【 disown 】コマンド――シェルのジョブテーブルからジョブを削除する

終了したいときは最悪killコマンドでプロセスを強制終了すればどうにかなるはずです。

検証とかでとりあえず一時的に動かし続けたい、とかなら2,3の方法
公開する、他のシステムから参照するなどで恒常的に動かし続けたいなら1の方法
が一般的だと思います。

投稿2021/06/27 14:43

yu_1985

総合スコア7588

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rikarikarika

2021/06/27 14:56

原理と対策の詳細なご説明をありがとうございます! シェルで動かすのとserviceで動かす違いなど分かりました。なるほど・・・です。 この数日もやもやしていたのがすっきりしました。本当にありがとうございました。
guest

0

3のコマンドを

nohup python -m SimpleHTTPServer 3000 &

にしてみるとどうでしょう

投稿2021/06/27 13:48

wai_

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rikarikarika

2021/06/27 14:50

早速のご回答ありがとうございます! power shellを閉じてもhello world表示できることが確認できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問