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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Webサーバー

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

Webサイト

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

Q&A

解決済

3回答

2123閲覧

Goの実行ファイルを既存のweb上に公開するには

tride

総合スコア68

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Webサーバー

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

Webサイト

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

0グッド

0クリップ

投稿2020/06/06 02:18

編集2020/06/06 02:29

何か勘違いをしているのか、思った情報が見当たらなかったので質問させて頂きます。
質問者のレベルは、Go言語を勉強して数日程度です。

現在、"すでに公開されているwebサイト"にて使用しているPHPの置き換えとしてGoの実行ファイルを使ってみようと思って試しています。
そこで、Goでビルドした実行ファイル(exe)をphpファイルのように、ファイルサーバに置けばブラウザから同じように表示できるのかと思っていたのですが、Not Foundで上手くいきません。

そもそもApacheでexeを実行できるように設定するのか、それともGoの実行ファイルにwebサーバー機能を持たせてアクセスするのか、他に何かやり方があるのかすら、分かっていません。

何か、指摘事項や解説サイトがあれば教えていただければ幸いです。

<環境>
・Apacheが公開サーバー上ですでに動いている
・index.phpがすでに外部に公開されている(index.phpにアクセスするURLは、仮にhttp://www.example.com/page1とします)
・Goの機能はPOSTされたら、何らかの値を返してブラウザにテキストを表示するだけのものを想定
・クライアントはChromeを想定
・サーバーは、自分が立てた個人的なもの(root権限ありのcentos7)

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

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

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

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

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

m.ts10806

2020/06/06 02:21

その公開サーバーは、どのようなものなのでしょうか。レンタルとか自身で立てたとか、色々あるかとは思いますが、レンタルだとJavaすら動かないところも多いのでGoが動くかというと…
tride

2020/06/06 02:24 編集

質問本文に質問内容を反映しました。 Apacheが稼働しているサーバーは自分が立てた個人的なサーバーとなります。
m.ts10806

2020/06/06 02:28

Goには明るくないのでこちらのコメントで続けますが、下記のような質問が参考になるかもしれません。 https://teratail.com/questions/165527 いずれにしても「Apache go 公開」とかで調べて出てくるものですが… Web側のフレームワークもあるはずなので、そのへん使えばまた展開のしかたもあるのかなと。
Kenji.Noguchi

2020/06/06 02:29

CGIとして作ったと言うことですか?今の時代CGIは流行らないので「Goの実行ファイルにwebサーバー機能を持たせる」のが良いと思います。個人的には使ったことがありませんがbeegoと言うウェブフレームワークが流行っているみたいです。
tride

2020/06/06 02:49

>m.ts10806さん URLのページを見させていただきました。 自分でもこのページは見ていたのですが、この回答を見る限り、「最初はApacheはいらないので」とあったので、いずれは必要?と考え、だったら既にApacheが動いている環境ではどうするの?と思いました。 >Kenji.Noguchi 「Goの実行ファイルにwebサーバー機能を持たせる」ということですが、この場合、Apacheの設定はどうなるのでしょうか? まったく別のwebサーバーとして稼働するのでしょうか? beegoについては、これから調べて見てみたいと思います。
hentaiman

2020/06/06 02:51

> 今の時代CGIは流行らないので「Goの実行ファイルにwebサーバー機能を持たせる」のが良いと思います。 そうなんですか?
hentaiman

2020/06/06 02:52

> 「Goの実行ファイルにwebサーバー機能を持たせる」ということですが、この場合、Apacheの設定はどうなるのでしょうか? 言葉通りならapache使わないっていう意味です
m.ts10806

2020/06/06 02:53

WebフレームワークでしたらEchoはちょこっと個人的にやったことがあります。先に出されたbeegoも同じようにWebフレームワークですね。 やりたいことによって採用を検討してください。学習コストもそれなりにかかります。 https://rightcode.co.jp/blog/become-engineer/go-flamework
tride

2020/06/06 03:00

Webフレームワークについては、今はまだそこまでのものは考えておりません。 あくまで、「"POST"したらブラウザ上にテキストが表示される」だけを考えています。 なので、元となったphpファイルも100行にも満たないスクリプト的なファイルになります。
m.ts10806

2020/06/06 03:02

「そのほうが簡単にできるしGoも使えるので一石二鳥では」という意図の提案ですので。
tride

2020/06/06 03:09

>m.ts10806さん ありがとうございます。
tride

2020/06/06 03:12

回答を見ていて今気づいたのですが、もしかしてGoの実行ファイルは、phpとは違い、サーバー(centos)上で、Apacheの様に常に実行している状態(タスクスケジューラに登録といった起動終了の管理をしたり)にする必要があるという事でしょうか?
guest

回答3

0

ベストアンサー

Go には標準ライブラリ(net/http)を用いて HTTP サーバとして振る舞うことができます。例えば POST リクエストを受けて、何らかのレスポンスを返すことができます。

Go でとてもシンプルな HTTP サーバを実装例は以下です。

  • main.go

go

1package main 2 3import ( 4 "fmt" 5 "log" 6 "net/http" 7) 8 9func main() { 10 http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { 11 fmt.Fprintf(w, "Hello World") 12 }) 13 14 log.Fatal(http.ListenAndServe(":8080", nil)) 15}

上記の main.go を go build でビルドすると exe の実行ファイルが生成されます。この exe を 実行する ことで HTTP サーバとして振る舞うことができます。実行するとプロセスとしてサーバ上に立ち上がります。実行後に例えば上記の /hello のパスに curl してレスポンスを取得することができます。

$ curl -X POST http://localhost:8080/hello Hello World

そこで、Goでビルドした実行ファイル(exe)をphpファイルのように、ファイルサーバに置けばブラウザから同じように表示できるのかと思っていたのですが、Not Foundで上手くいきません。

上手くいかなかった理由としては、ファイルをサーバ上のあるパスにおいておく、だけでは HTTP サーバになることはできません。実行ファイル (exe) を 実行する 必要があります。必要に応じて systemd などで起動するように config します。


できることと想定の非機能要件を満たすように実装することは別で考える必要があります。公開されるサイトの非機能要件に応じて、hentaiman さんが言われているように、Apache をリバースプロキシとして振る舞うように config するなどが必要でしょう。

投稿2020/06/06 03:57

d_tutuz

総合スコア730

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

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

hentaiman

2020/06/06 10:59

systemdも併せて教えておくのは素敵な配慮ですね 横から質問させてください。goってapacheよりnginxと連携した方が良さそうだけど現場ではどうなんでしょうか?APIサーバーとしてならどうでも良いけど、API目的ならgRPCにするだろうから結局フロントとして使うならnginxと併用するものだろうと思うのですが、質問修正依頼には今時Go単体で良いじゃんみたいなコメントもあったので。よければ教えてください。 もちろん仕事上のナレッジなので教えるのNGという事でしたら結構です。
d_tutuz

2020/06/06 11:49 編集

hentaiman さん > API目的ならgRPCにするだろうから... API設計としてgRPCを用いるのかRESTかOpenAPIなのか、現場によって異なるとは思います。 私はチーム開発をするときAPIとしてOpenAPI(Swaggerベース)を用いることが多いです。かつ、最近はALB+ECS(GoのHTTPサーバ)やAPI Gateway+Lambda(GoのHTTPサーバ)という構成を取ることが多いです。 ということで、想定の前提が異なるかもしれない&期待される回答になるかわかりませんが、仮にAPIにgRPCを選択したとしても、Goのシングルバイナリ単体で構えるよりも、手前にリバースプロキシを構えてTLSの終端なりロードバランサなり、タイムアウトなりの制御できるほうが、可用性とか運用性の観点から望ましいと思います。(とりあえず動けばいいのであれば何でもOKです) リバースプロキシの実装としてはNginxが扱いやすそうな気がします。(Apacheのモジュールがあるのかどうは分からずです)
hentaiman

2020/06/06 12:14

> 想定の前提が異なるかもしれない&期待される回答になるか とんでもない。全部参考になります。 偏見ですがgo採用しているならgRPCを使う思っていたので、そういう観点でもとても参考になりました。もしお話し伺う事無くにgoを使う時が来ていたら無心でgRPC一択にしちゃっていたと思います。 リアルな情報踏まえて教えてくださりありがとうございます。
tride

2020/06/08 01:40

>上手くいかなかった理由としては、ファイルをサーバ上のあるパスにおいておく、だけでは HTTP サーバになることはできません。実行ファイル (exe) を 実行する 必要があります。必要に応じて systemd などで起動するように config します。 >Apache をリバースプロキシとして振る舞うように config するなどが必要でしょう。 この辺り、まるで頭になかったです。 質問の回答として、最も求めていた答えに近かったので、ベストアンサーに選ばせていただきます。 それとgRPCなどhentaimanさんからのの話についてもとても参考になりました。
guest

0

最初からWeb向けに作られたPHPでは簡単にできることが他の言語では難しいってことが意外とある。
CGIはもうないものとすると、ファイル置くだけで動くのはPHPだけなので他の言語ではこの使い方はできない。

フレームワークなどを使ってWebサーバーとして機能させるしかないけど
ちょっとしか単機能では過剰。

方法はいくつかある。

・Goで作った実行ファイルをPHPからexec()などで呼び出す。
同じサーバーで動かす一番簡単な方法。

・AWS Lambdaなどを使ってAPIを作る。
単機能なら現状ベストな方法。

投稿2020/06/06 03:37

kawax

総合スコア10377

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

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

tride

2020/06/08 01:39

>・Goで作った実行ファイルをPHPからexec()などで呼び出す。 >同じサーバーで動かす一番簡単な方法。 >・AWS Lambdaなどを使ってAPIを作る。 >単機能なら現状ベストな方法。 PHPのexec()の事を忘れていましたが、言われてみればそういうやり方もありましたね。 Lambdaについては今回は対応外ではありますが、手段としてとても参考になりました。
guest

0

WEBサーバーの事は分かる程度の人の回答だと思ってください。(Goの知識は数時間程度しか知りません(しかもgRPCのみ)

CGIとして実行する必要があります。
以下の通りUNIXドメインソケット立てて待ち受けてapacheでGoへのリクエスト受けたらGoへ流してください。(apacheの稼働サーバーと別のところに置くならこのやり方は無理です)
https://qiita.com/masahikoofjoyto/items/f60188f4252e455541d4

goでhttp(s)のリクエストをまるっと全部受け付けるのは推奨しません

追記

goを知らないが故に質問修正依頼のコメント欄の影響されて少し弱い回答になってしまいましたが、返答のコメントも無いようですので、d_tutuzさんに頂いたコメントと自分の経験をもとに改めて明記します。

クライアントからのリクエストをgoで直接受ける事だけは非推奨です。

投稿2020/06/06 03:16

編集2020/06/07 07:33
hentaiman

総合スコア6421

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

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

tride

2020/06/08 01:39

>クライアントからのリクエストをgoで直接受ける事だけは非推奨です。 回答ありがとうございます。 やはりその答えになるようですね。 Apache無視で本当にいいのか?とすごく不安だったので安心しました。
hentaiman

2020/06/08 01:51

web知ってる人の常識から考えると、apacheやnginxの有用性を知っていればgoで直受けなんてありえないです。というか仕事でそんな事やるやついたらぶん殴ります(心の中で)。 せっかく高速なgoに置き換えるならapache捨ててnginxに乗り換えた方がいいと思います。リバースプロキシと静的ファイルのレスポンスだけを仕事にするならapacheである必要が無いです 逆に言うと遅くて良いならphpとapacheのままでいいかな
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問