U-Yuri’s 健忘録

U-Yuri’s 備忘録

プログラミングを勉強しています。アウトプットに活用しているブログです。

①Railsアプリをデプロイするまで【nginx】【puma】

nginxとは

nginxはロシアのIgor Sysoev氏によって開発されているWebサーバ兼リバースプロキシのソフトウェア。 - 静的なコンテンツを提供するWebサーバ 動的なコンテンツはnginx単体では提供できない。Webアプリケーションサーバと連携することにより動的コンテンツを提供する。

  • Webアプリケーションとの連携
    nginxではWebアプリケーションを(apacheのmod_phpやmod_wsgiのように)Webサーバ自体に組み込んで動作させることはできないため、WebアプリケーションをFastCGIやSCGIやuWSGIに対応したアプリケーションサーバ上で動作させて、ネットワークあるいはUNIXドメインソケットを経由して利用する。
    ※Webアプリケーションとの連携についても性能向上のために以下のような機能がある。
    キャッシュ:Webアプリケーションサーバから取得したコンテンツをキャッシュできる。
    memcached:Webアプリケーション側でコンテンツをmemcachedにキャッシュさせることができるときには、nginxはmemcachedからコンテンツを読み出すことができる。
    ロードバランサ:ロードバランサとしての機能を持っており、複数のアプリケーションサーバを利用して負荷を分散することができる。利用できなくなったアプリケーションサーバを自動的に外すこともできる。

  • リバースプロキシ
    プロキシとは:「代理」という意味であり、内部ネットワークからインターネットに接続する際に中継の役割を担うサーバーのことで、「プロキシサーバー」とも呼ばれる。
    リバースプロキシとは:外部インターネットからサーバーへアクセスされる通信を中継する仕組みを指す。プロキシと比較すると、インターネットへ接続する方向が逆(リバース)になるため、リバースプロキシと呼ばれる。

参考: nginx連載1回目: nginxの紹介 - インフラエンジニアway - Powered by HEARTBEATS

pumaとは

railsを動かすためのサーバ。
Webサーバの役割もかねることができブラウザからのリクエストを元にリスポンスも返すことができる。
railsでデフォルトで設定されているサーバ。

$ rails s

で動くサーバはpumaということ。 PumaはWebサーバとしての機能を兼ねることもできるが、通常の本番運用ではPumaはアプリケーションサーバとしての機能に特化させて、NginxやApache等のWebサーバと連携させた構成にすることが多い。

設定していく

  • $ sudo vim /etc/nginx/nginx.confを書き換える
http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
        
---------serverを追加-----------------------------
        server {
                listen 0.0.0.0:80;
                # server-name
                location / {
                        proxy_pass http://127.0.0.1:80;
                }
        }
-----------------------------------------------------
}
  • 書き換えたら一度$ sudo systemctl reload nginx :nginxをリロードする

    エラー

  • $ sudo nginx -tconfigをtestするためのコマンド(りろーどできなかったから詳しいエラーを確認した)

$ sudo nginx -t
2023/09/09 11:25:09 [emerg] 27850#27850: invalid URL prefix in /etc/nginx/nginx.conf:66

※原因はconfを書き換えた際にスペルミスをしていた(http//:になってしまっていた)

  • 再度$ sudo systemctl reload nginxしたら大丈夫だった。
  • $ sudo nginx -tでもう一度確認
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

解決 - サーバを起動してブラウザから確認しようとしたらエラーだった。

  • accesslogの見方/var/log/nginx/access.log;
  • 実行したが何も入っていなかったので$ sudo cat /var/log/nginx/error.log確認。 →情報なし

  • curlコマンドで同じパソコンから繋げたら大丈夫だった。

$ curl ik1-343-31774.vs.sakura.ne.jp
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • 違うパソコンからターミナルでつないでみる。
 curl -v ik1-343-31774.vs.sakura.ne.jp
*   Trying 153.126.215.28:80...

↑さくらVPSIPアドレスと同じ(VPSのコントローラーからログインし確認)

$ sudo apt-get install ufw
  • $ sudo ufw app listを実行しすでに設定されているアプリケーション構成を一覧表示
$ sudo ufw app list

Available applications:
  AIM
  Bonjour
  CIFS
  DNS
  Deluge
  IMAP
  IMAPS
  IPP
  KTorrent
  Kerberos Admin
  Kerberos Full
  Kerberos KDC
  Kerberos Password
  LDAP
  LDAPS
  LPD
  MSN
  MSN SSL
  Mail submission
  NFS
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
  POP3
  POP3S
  PeopleNearby
  SMTP
  SSH
  Socks
  Telnet
  Transmission
  Transparent Proxy
  VNC
  WWW
  WWW Cache
  WWW Full
  WWW Secure
  XMPP
  Yahoo
  qBittorrent
  svnserve

Nginx Full:このプロファイルは、Nginx のポート 80 と 443 の両方を開く。
Nginx HTTP:このプロファイルは、Nginx のポート 80 のみを開く。
Nginx HTTPS: このプロファイルは、Nginx のポート 443 のみを開く。
今回はNginx Fullをポート 80および443 で HTTP トラフィックを許可する設定にするので以下のコマンドを実行する。

~$ sudo ufw allow 'Nginx Full'

[sudo] password for debian:
Rules updated
Rules updated (v6)
$ sudo ufw status
Status: inactive

activeになればいいがinactive(非活性)となりエラー。

  • $ sudo ufw allow 22を実行し開放するポートを記述。
    ssh のポート22を最初に開放しておかないと、sshで接続できなくなってしまう)
$ sudo ufw allow 22

Rules updated
Rules updated (v6)
  • $ sudo ufw enableコマンドでufwを起動(有効化)
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
  • $ sudo ufe statusで状態を確認
$ sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
Nginx Full                 ALLOW       Anywhere
22                         ALLOW       Anywhere
Nginx Full (v6)            ALLOW       Anywhere (v6)
22 (v6)                    ALLOW       Anywhere (v6)

activeとなっているのでOK。

  • $ curl -v 〇〇.vs.sakura.ne.jpコマンドでもう一台のパソコンで確認してみる。
    まだできない(´;ω;`)

  • さくらVPSのコントロールパネル内の「パケットフィルター設定」→「パケットフィルター設定」をクリック→「パケットフィルター設定を追加」をクリック→「Web」を追加する。

  • ほかのPCのブラウザで確認。  
    大丈夫そう!!!!!

  • ファイヤーオールの設定は、さくらVPSの先ほどの設定だけで十分で、ufwは意味なかったのでアンインストールする。

  • まずは$ sudo ufw disableコマンドで停止する

  • $ sudo ufw status コマンドでinactive(非活性状態)になっているか確認。

  • $ sudo apt-get remove ufw を実行しアンインストール

  • ほかのPCのブラウザで再度確認。  
    ufwの設定は必要なかったらしいということが分かった。

次回へ続きます🔥