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

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

ただいまの
回答率

90.50%

  • Python 3.x

    9862questions

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

  • Apache

    2109questions

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

python3.6でapache2とmod_wsgiの環境を作りたいのですが、うまく行きません。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,701

UekiKouji

score 108

以前も同じような質問をしました。しかし今回は、別の異なる事で悩んでいます。ご教授をお願いします。
python3を以下のように構築し、venv環境を/home/ubuntu/envで構築しました。サーバはubuntu16です。

sudo apt-get -y install build-essential libsqlite3-dev libreadline6-dev libgdbm-dev zlib1g-dev libbz2-dev sqlite3 tk-dev zip libssl-dev gfortran liblapack-dev


リスト 1.2 Python 3.6.1のソースからのインストール

$ wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
$ tar axvf ./Python-3.6.1.tgz
$ cd ./Python-3.6.1/
$ LDFLAGS="-L/usr/lib/x86_64-linux-gnu" ./configure --with-ensurepip
$ make
$ sudo make install

リスト 1.3 Pythonのバージョン確認

$ hash -r
$ python3 -V
Python 3.6.1

/usr/local/bin/python3 -m venv env

source env/bin/activate

その後、こちらのサイトを参考に以下の設定を行いました。

http://qiita.com/makky05/items/98b86ca36776a524dfc9

sudo apt-get install apache2

sudo apt-get install libapache2-mod-wsgi-py3

// /home/hoge/hello.py

import sys

def application(environ, start_response):
    status = '200 OK'
    output = b'Hello World! python version : ' + sys.version.encode("utf-8")

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

// /etc/apache2/sites-available/python.conf

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias / /home/ubuntu/hello.py
WSGIPythonPath /home/ubuntu/./env/lib/python3.6/site-packages

<Directory /home/ubuntu>
   Require all granted
</Directory>
$ sudo a2ensite python.conf
$ sudo service apache2 start


そして、上記の作業を行いました。サイトにアクセスすると、以下の結果になりました。
// http://192.168.33.11にアクセス
イメージ説明

どうも、libapache2-mod-wsgi-py3はubuntuデフォルトでインストールされているpython3.5.2に反応しているようです。

なので、mod_wsgiをソースからインストールしました。

cd 
$ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.4.13.tar.gz
$ tar zxvf 4.5.17.tar.gz
$ mv mod_wsgi-4.5.17 /usr/local/src
$ cd /usr/local/src/mod_wsgi-4.5.15
$./configure LDFLAGS='-Wl,-rpath=/home/kou/./env/lib'
$ make
$ sudo make install


ソースから、mod_wsgiをインストールしましたが、設定は、変更していません。
しかし、apache2を再起動しましたが、エラーになりうまく起動しませんでした。

ここから、質問です。
ソースからインストールしたpython3.6に対応したmod_wsgiのインストール方法を教えてください。
お願いします。
ちなみに、pipでインストールすると以下のようなエラーになりうまく行きません。

ubuntu@ubuntu-xenial:~$ pip install mod_wsgi
Collecting mod_wsgi
  Using cached mod_wsgi-4.5.17.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-rf_k0m_2/mod-wsgi/setup.py", line 164, in <module>
        'missing Apache httpd server packages.' % APXS)
    RuntimeError: The 'apxs' command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.
    Error in sys.excepthook:
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
        from apport.fileutils import likely_packaged, get_recent_crashes
      File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
        from apport.report import Report
      File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
        import apport.fileutils
      File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
        from apport.packaging_impl import impl as packaging
      File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
        import apt
      File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
        import apt_pkg
    ModuleNotFoundError: No module named 'apt_pkg'

    Original exception was:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-rf_k0m_2/mod-wsgi/setup.py", line 164, in <module>
        'missing Apache httpd server packages.' % APXS)
    RuntimeError: The 'apxs' command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-rf_k0m_2/mod-wsgi/
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

直接的な回答にはなりませんが、もしPythonのバージョンを切り替えて使用したいなら、
mod_wsgiではなく mod_proxy_uwsgi の使用してはどうでしょうか。
この場合あらかじめ起動したuwsgiプロセス(サーバ)に対して、
Apacheで特定のURLをリバースプロキシやロードバランサーとしてマップする形になります。
http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#installing-uwsgi-with-python-support

python uwsgiconfig.py でビルド時に異なるバージョンを作成しそれぞれ起動すれば、呼び出すURLによって異なるバージョンのpythonを使用するなどもできますし、環境変数をコマンドライン上で変更した状態を引き継がせられるため、限られたサーバ台数で異なる環境を走らせる際には使いやすいと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/15 16:18

    ざっくりとapacheとの連動について調べてみたのですが、どのように設定したら良いのか。想像がつきません。本当にしょうもない質問で、申し訳ないと思っています。どのように連携したら良いのでしょうか。よろしくお願いします。

    キャンセル

  • 2017/08/16 00:20 編集

    最初に、Apacheが80番ポートを使ってユーザのブラウザからの接続を待ちうけ(Listen)して、
    もし接続があればhttpという規格でブラウザとやり取りするというのはご存知かと思います。
    uWSGIはこれと同様に、適当な番号のポートで待ち受け、ブラウザではなくApacheやnginxなどのWebサーバからの接続を待機します。
    Apacheと同一のマシン上で実行する場合は、ポートではなくunixドメインソケットを使います。
    (ソケットファイルを安全な場所に保管することで関係ない接続を避けられます)


    設定としては、まずuwsgi側をどう待ち受けさせるかを決め、それに沿って起動させておき、あとはApache側でそこへ接続するように設定します。

    uwsgi のインストール。
    ```sh
    $ python3.6 -m pip install uwsgi
    ```

    起動 (起動オプションは設定ファイルを書いても良いです。)
    ```sh
    $ cd /path/to/myproject
    $ mkdir tmp/
    $ PYTHON=python3.6 uwsgi -s /tmp/uwsgi.sock \
    --wsgi-file mywebapp.py \
    --chmod-socket=666 --daemonize tmp/uwsgi.log \
    --touch-logrotate tmp/logrotate.trigger
    ```

    mod_proxy_uwsgi インストール
    ```sh
    $ mkdir mod_proxy_uwsgi
    $ cd mod_proxy_uwsgi
    $ wget https://raw.githubusercontent.com/unbit/uwsgi/master/apache2/mod_proxy_uwsgi.c
    $ apxs -i -c mod_proxy_uwsgi.c
    ```

    apacheの設定
    ```apache

    LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
    # ...
    # 全てのリクエストをuwsgiに振る場合
    ProxyPass / "unix:/tmp/uwsgi.sock|uwsgi://uwsgi-app-name/"


    # 一部のリクエストのみを振るような場合
    <Proxy "balancer://mybalancer">
    BalancerMember "unix:/tmp/uwsgi.sock|uwsgi://uwsgi-app-name/"
    </Proxy>
    <VirtualHost your-host-name:80>
    DocumentRoot /path/to/my/web/root/
    RewriteEngine on
    # 条件を絞る。ここではURLパス部と同名ファイルが存在しない時に限定。
    # 画像ファイルや.cssへのアクセスはapache側で処理する
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteRule ^/(.*)$ balancer://mybalancer/$1 [P,QSA,L]
    </VirtualHost>
    ```

    pythonで同様のサーバ構成としてはuWsgiの他にGunicornというのも使えるようです。
    他言語でもJavaならajpのプロトコルを使ってtomcatを動かしたり、
    phpならfastcgi(fpm)を動かしたりなど、同じような構成のWebアプリケーションは多数あり、構成自体は結構良くあるパターンだと思います。

    キャンセル

  • 2017/08/16 00:46

    ありがとうございます。やってみます。

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    9862questions

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

  • Apache

    2109questions

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