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

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

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

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Apache

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

4646閲覧

WEB上(CGI)でseleniumがタイムアウトする

pythoneer

総合スコア1

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Apache

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/03/09 07:35

環境

さくらクラウド(CPU2コア、メモリ3GB)
CentOS Linux release 8.2.2004
Apache/2.4.37 (centos)
Python 3.6.8
Mozilla Firefox 78.2.0esr
geckodriver-v0.28.0
selenium Version: 3.141.0

ディレクトリ
/var/www/cgi-bin/test.py 755

参考にしたもの
https://teratail.com/questions/278712
https://teratail.com/questions/281874

実現したいこと

Webブラウザからサーバにアクセスし、サーバからSeleniumでwebページにアクセスした結果をブラウザに表示したい。

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

webブラウザ越しでアクセスするとタイムアウトエラーが発生する。

タイトル: 504 Gateway Timeout Gateway Timeout The gateway did not receive a timely response from the upstream server or application.

該当のソースコード

Python3

1#!/bin/python3 2# -*- coding: utf-8 -*- 3from selenium import webdriver 4from selenium.webdriver.firefox.options import Options as Options 5import cgi # CGIモジュールのインポート 6import cgitb 7cgitb.enable() 8options = Options() 9options.add_argument('--headless') 10options.add_argument('--no-sandbox') 11driver = webdriver.Firefox(executable_path=r'/usr/local/bin/geckodriver', options=options) 12driver.implicitly_wait(120) 13print("Content-Type: text/plain;charset=utf-8") #HTMLを出力するために必要 14print("") #HTMLを出力するために必要 15driver.get('https://yahoo.co.jp') 16print(driver.title) 17

試したこと

ローカルで動くことは確認済み

python3

1# python3 /var/www/cgi-bin/test.py 2Content-Type: text/plain;charset=utf-8 3 4Yahoo! JAPAN

パス等の確認

# which python3 /bin/python3 # locate geckodriver /usr/local/bin/geckodriver /var/www/cgi-bin/geckodriver /var/www/cgi-bin/geckodriver.log # pip3 show selenium Name: selenium Version: 3.141.0 Summary: Python bindings for Selenium Home-page: https://github.com/SeleniumHQ/selenium/ Author: UNKNOWN Author-email: UNKNOWN License: Apache 2.0 Location: /usr/local/lib/python3.6/site-packages Requires: urllib3 # pip3 show webdriver <--何も表示されず完了 # # pwd /var/www # ls -al 合計 16 drwxr-xr-x 4 root root 4096 3月 4 22:29 . drwxr-xr-x. 22 root root 4096 3月 4 22:29 .. drwxr-sr-x 4 apache apache 4096 3月 9 16:29 cgi-bin drwxrws--- 2 apache apache 4096 3月 9 15:29 html

エラーメッセージ

# vim /var/log/httpd/error_log [Tue Mar 09 16:20:27.322982 2021] [cgid:warn] [pid 556195:tid 139623355320064] [client 133.106.33.134:56847] AH01220: Timeout waiting for output from CGI script /var/www/cgi-bin/test.py [Tue Mar 09 16:20:27.323102 2021] [cgid:error] [pid 556195:tid 139623355320064] [client 133.106.33.134:56847] Script timed out before returning headers: test.py

CGIを扱った経験が少ないため見当違いな事をしているかもしれません。
参考のページや他のサイトも見ながら進め、implicit_waitも長くしたり、python3のパスの確認等もしましたが原因がわからず難航しております。

何か間違いがあるのでしょうか。
お力添えいただけると幸いです。
他に必要な情報があればお知らせください。

どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ひょっとすると、質問の趣旨を読み違えているかもしれませんが、
エラーメッセージからは、test.pyからの応答が届く前にApacheがタイムアウトしているようですので、タイムアウト時間を長くすることで、対処できるように思われます。

mod_cgidをご利用のようですので、ご利用のApacheの設定ファイルに CGIDScriptTimeout を使って、もっと長いタイムアウトの時間をセットしてみてください。

(記述例)120秒の場合
CGIDScriptTimeout 120

参考: https://httpd.apache.org/docs/2.4/en/mod/mod_cgid.html#cgidscripttimeout

投稿2021/03/15 16:50

ohgrkrs

総合スコア29

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

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

pythoneer

2021/03/22 23:22

返信が遅くなり申し訳ありません! /etc/httpd/conf/httpd.confに下記を追加しました。 CGIDScriptTimeout 600 タイムアウトは長くなった気がしますが、依然としてエラーメッセージが出ています。 ただ、内容は変わっており、 [Tue Mar 23 08:13:11.611315 2021] [http:error] [pid 1012026:tid 139706964604672] [client 133.106.36.43:63930] AH02429: Response header name '<!--' contains invalid characters, aborting request, referer: http://[url]/index.html となっていました。 pyファイルの問題かと思い、ログを取るために7行目を下記に変更しました。 cgitb.enable(display=0, logdir="./") 作成されたtmpファイルを見た所、下記のエラーが確認できました。 Traceback (most recent call last): File "/var/www/cgi-bin/test.py", line 12, in &lt;module&gt; driver = webdriver.Firefox(executable_path=r'/usr/local/bin/geckodriver', options=options) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 174, in __init__ keep_alive=True) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__ self.start_session(capabilities, browser_profile) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: Connection refused (os error 111) パーミッション関係かと思い下記を実行 # ls -al /usr/local/bin/geckodriver -rwxr-xr-x 1 [ログインユーザ] [ログインユーザ] 7932136 11月 4 01:13 /usr/local/bin/geckodriver apacheである必要があるかと思い、所有者変更 # chown apache:apache geckodriver # ls -al /usr/local/bin/geckodriver -rwxr-xr-x 1 apache apache 7932136 11月 4 01:13 /usr/local/bin/geckodriver とここまでやってみましたが、エラーメッセージは変わりませんでした。 何か他に原因がありそうでしょうか。
ohgrkrs

2021/03/30 16:14

私からの回答はApache httpdのエラーの内容からの判断です。 ご質問にある以下のエラーは、CGIプログラムが作成するレスポンスヘッダが正しくないという意味です。 > AH02429: Response header name '<!--' contains invalid characters, aborting request, referer: http://[url]/index.html この場合「<!--」というヘッダが返っているようです。 もちろん、そのようなヘッダを返す意図はないと思いますので、test.pyが正しい形式でレスポンスを生成していないことが疑われます。 当初のご質問で、 > ローカルで動くことは確認済み と書かれた情報から、レスポンスのヘッダとしては、 > Content-Type: text/plain;charset=utf-8 ボディとしては取得したWEBページのタイトルを出力しているように見受けられました。 > Yahoo! JAPAN また、ヘッダとボディの間には空行もあり、最低限の体裁は整っているように見受けられましたが、何か修正されたでしょうか? あらためて、ローカルで実行してみて、出力内容にエラーメッセージに言うような「<!--」が含まれていないかご確認ください。 もし、ローカルでは出ず、CGI環境でのみ出力されるヘッダがあるとすると、CGIで実行しているプログラムが間違いなくtest.pyか確認が必要と考えられます。
pythoneer

2021/04/01 16:23

ご返信、ありがとうございます! ローカルで再実行した所動いていなかったのでdiffを取ってみた所、最終行のprintがrintに書き換わっているのを発見しました。 該当部を修正し、ローカルで正しく動くのを確認しました。 # python3 test.py Content-Type: text/plain;charset=utf-8 Yahoo! JAPAN == 改めてブラウザからアクセスしましたところ、結果としてエラーは変わらず # vim /var/log/httpd/error_log AH02429: Response header name '<!--' contains invalid characters, aborting request, referer: http://[url]/index.html ※urlはサーバのIPアドレスが入っています と表示されます。 同じcgi-binフォルダ内、同一オーナー/パーミッションのパイソンファイルは正しく動作するのでURLで指定している実行ファイルは間違いないと思っております。 その他関係しそうな情報があれば出したいのですが、どこが原因かわかっておりません。
ohgrkrs

2021/04/03 10:06

参考になればよいのですが、 たとえば、私の環境で試しに、test.pyを実行しようとしたところでは、 /usr/local/bin/geckodriverが存在しないため実行に失敗しました。 ただ、その際先頭に次のような行が付与されていました。  $ ./test.py  <!--: spam  Content-Type: text/html  (略) 今回のエラーは、CGIプログラム実行時にエラーが発生したため、 その出力に上記のように「<!--: spam」が挿入されたことが原因と思われます。  ※おそらくcgitbの機能と思われます。実際、手元では、   cgitb.enable()   をコメントアウトすると「<!--: spam」は出力されませんでした。 そこで一時的に、Apache httpdの設定ファイル httpd.confに ----------------------------- HttpProtocolOptions Unsafe ----------------------------- を指定して動作確認できるでしょうか。 この設定は、Apache httpdでのヘッダのチェック条件を緩和します。 ただし、有効にするには、設定を追加して、Apache httpdを再起動する必要があります。 これにより、test.pyからの出力内容がApacheのヘッダのチェックを回避して、ブラウザに出力されると期待されます。 うまく出力されたらブラウザの出力内容を確認してみてください。 もしtest.py実行にかかわるエラーが確認できれば、それへの対処を行ってください。
pythoneer

2021/05/09 23:47

すみません!大変お礼が遅くなりました。 本件取り扱える環境でなくなり確認ができなくなったため、完了とさせて下さい。 ご回答頂いたことは非常に勉強になり、また原因究明の役に立ったのでベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問