CentOS7+nginx+apache2.4+Python3の環境を作る-nginxでリバースプロキシ

前回ははapacheとmod_wsgiの連携をし、bottleを動かしました。今回はnginxを使ってリバースプロキシを行います

注意点

この記事の時点ではまだnginxはいないため、apacheは80番ポートで動いてます。今回の記事でnginxをインストールしてapacheが8080番になります

環境

  • ベンダー:さくらのクラウド
  • OS:CentOS7
  • フロント:nginx(80番ポート)
  • バックエンド:Apache2.4(8080番ポート)
  • Python:3系(pyenvを使用)
  • フレームワーク:bottle(8081番ポート)

基本的にsudo環境にする予定です。

手順

基本的には以下の手順になります

  1. Apacheのインストール
  2. Python(pyenv)のインストール
  3. pipの設定
  4. Apache+Pythonの連携
  5. nginxを使ってリバースプロキシ←ここ

今回の記事について

今回は手順の5を行います。nginxとのリバースプロキシが不要の場合は前回の記事で完結となります。今回はフロントにnginxをおいての作業です

現在の状態

apacheでpythonを動かしている状態です

nginxを使っても構造は変わらない

今回nginxはapacheの手前におくため、nginxをインストールしたからといってapacheを止めて良いわけではありません。このやり方はユーザーがアクセスしたらnginxでうけてapacheに転送するやり方です

nginxについて

logwでは過去にnginxのインストールnginxとApacheを連携を記事にしてます。今回はそれと同じ事をするだけになります。ではやっていきます

Apacheの設定変更

まずは既に動いているapacheの設定変更をします

apacheの停止

[macan@localhost ~]$ sudo service httpd stop
Redirecting to /bin/systemctl stop httpd.service

まずは停止します。

confファイルの変更

42行目付近を書き換えます
※環境によって行数は異なる可能性があります

[macan@localhost ~]$ sudo vi /etc/httpd/conf/httpd.conf

 31 ServerRoot "/etc/httpd"
     32
     33 #
     34 # Listen: Allows you to bind Apache to specific IP addresses and/or
     35 # ports, instead of the default. See also the <VirtualHost>
     36 # directive.
     37 #
     38 # Change this to Listen on specific IP addresses as shown below to
     39 # prevent Apache from glomming onto all bound IP addresses.
     40 #
     41 #Listen 12.34.56.78:80
     42 Listen 8080 ← 80から8080に変更

httpd.confの場合は↑のようになりますが、バーチャルホストの場合も載せておきます

<VirtualHost 127.0.0.1:8080>
・・・略・・・
</VirtualHost>

このようにします。

apacheを再起動

設定を変更したら、apacheを再起動をします

[macan@localhost ~]$ httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Syntax OK

[macan@localhost ~]$ sudo service httpd start
Redirecting to /bin/systemctl start httpd.service

ブラウザでhttp://IPアドレス/にアクセスしてもbottleが表示されてないと思います。

nginxのインストール

nginxを過去記事を参考にインストールしていきます

設定ファイルの作成

[macan@localhost ~]$ sudo vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

インストール

[macan@localhost ~]$ sudo yum  --enablerepo=nginx install nginx
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * elrepo: ftp.ne.jp
 * epel: ftp.iij.ad.jp
nginx                                                                                                                                                                                                                                                                                                 | 2.9 kB  00:00:00
nginx/x86_64/primary_db                                                                                                                                                                                                                                                                               | 125 kB  00:00:01
依存性の解決をしています
--&gt; トランザクションの確認を実行しています。
---&gt; パッケージ nginx.x86_64 1:1.15.6-1.el7_4.ngx を インストール
--&gt; 依存性解決を終了しました。

依存性を解決しました

=============================================================================================================================================================================================================================================================================================================================
 Package                                                                  アーキテクチャー                                                          バージョン                                                                                リポジトリー                                                              容量
=============================================================================================================================================================================================================================================================================================================================
インストール中:
 nginx                                                                    x86_64                                                                    1:1.15.6-1.el7_4.ngx                                                                      nginx                                                                    761 k

トランザクションの要約
=============================================================================================================================================================================================================================================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 761 k
インストール容量: 2.7 M
Is this ok [y/d/N]: y
Downloading packages:
nginx-1.15.6-1.el7_4.ngx.x86_64.rpm                                                                                                                                                                                                                                                                   | 761 kB  00:00:03
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : 1:nginx-1.15.6-1.el7_4.ngx.x86_64                                                                                                                                                                                                                                                            1/1
----------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:
* http://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* http://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:
* http://nginx.com/products/

----------------------------------------------------------------------
  検証中                  : 1:nginx-1.15.6-1.el7_4.ngx.x86_64                                                                                                                                                                                                                                                            1/1

インストール:
  nginx.x86_64 1:1.15.6-1.el7_4.ngx

完了しました!

インストール完了です

nginxの起動

nginxを起動させてテストページが表示されるか確認します

[macan@localhost ~]$ sudo service nginx start
Redirecting to /bin/systemctl start nginx.service

ブラウザでhttp://IPアドレス/にアクセスしてnginxのテストページが表示されたら成功です。

現在の状態

現在の状態を整理すると以下のようになります

  • nginxが80番ポートで起動
  • apacheが8080番ポートで起動

apacheがちゃんと起動しているか心配な人はsudo systemctl status httpdでステータス確認してみてください

nginxのリバースプロキシ設定

現在80番ポートはnginxのテストページです。これをリバースプロキシを使ってbottleの方へ渡します

nginxの設定を変更

nginxの設定を変更していきます。

[macan@localhost ~]$ sudo vi /etc/nginx/conf.d/default.conf

    location / {
        #root   /usr/share/nginx/html; #デフォルトをコメントアウトして追加
        root   /var/www/html; #ドキュメントルートはapacheと同じ箇所を指定する
        index  index.html index.htm;

        #追加-リバースプロキシの中身を追加
        proxy_set_header  X-Real-IP       $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  Host            $http_host;
        proxy_pass http://127.0.0.1:8080; #同じホストだけど、apacheが8080で動いているので8080に転送している
    }

最後のproxy_passでapacheに転送しています。書いたら念のためチェックします

[macan@localhost ~]$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

構文エラーもなし

nginxの再起動

nginxの再起動をします

[macan@localhost ~]$ sudo service nginx restart
Redirecting to /bin/systemctl restart nginx.service

ブラウザでhttp://IPアドレス/にアクセスしてもbottleが表示されていれば成功です。

なぜnginxを最後に持ってきたのか?

なぜnginxを最初ではなく最後に持ってきたのか?と思う方もいるかもしれません。最初にリバースプロキシの設定をする方が楽とか、順番的にその方が良いという意見もあるかもしれません。今回最後にもってきたのは理由があります

apacheとの連携を先に終わらせておきたかった

もしリバースプロキシを先に設定をしても、apacheとmod_wsgiの設定で躓いたらどうでしょうか?原因がどこか探るときに「リバースプロキシにあるかもしれない」という意見もでるかもしれません。先に設定をしたら一度解除してもう一度設定とか、firewallの設定を変えるなど必要がでます。

最後に持ってくる事で、そういった手間を省けることにもなります

終わりに

全部で5記事にわたり環境を構築しました。今回の記事を書きながら同時にさくらのクラウドで構築をしました。途中500エラーがおきたりもしましたが問題無く最後までできた事がよかったです。

Pythonの環境構築ははっきり言って「鬼」です。PHPのほうが楽じゃないかというぐらい「鬼」です。僕が書いた記事で少しでもPyhonの環境構築をしようと思った方の悩みが解決したり、手助けになれば幸いです