[RUBY] Erstellen Sie eine REST-API mit Apache2 + Passenger + Sinatra.

Konstruktionsrichtlinie für die REST-API

Ich führe den Hauptdienst bereits auf Apache2 aus, daher möchte ich die Netzwerkeinstellungen für die REST-API nicht ändern. Also starte ich Sinatra auf Apache2. Sollte es ein Leistungsproblem geben, rufe ich die Rust-Funktion über FFI auf. Sinatra veröffentlicht die REST-API parallel zur von Apache2 veröffentlichten Haupt-App. Machen Sie es in der folgenden Form aufrufbar.

http://localhost:8080/main_app
http://localhost:8080/sinatra

Referenzmaterial

  1. [Installing Passenger + Apache on Ubuntu 18.04 LTS (with APT)] (https://www.phusionpassenger.com/library/install/apache/install/oss/bionic/)
  2. [Deploying an app to a sub-URI or subdirectory] (https://www.phusionpassenger.com/library/deploy/apache/deploy/ruby/#deploying-an-app-to-a-sub-uri-or-subdirectory)
  3. Andere Artikel von Leuten, die ähnliche Herausforderungen angenommen haben (danke!)

Grundinstallation

Erstellen Sie mit Vagrant eine experimentelle Umgebung. Die Installationselemente lauten wie folgt.

  1. Apache2
  2. Ruby
  3. bundler
  4. Sinatra
  5. sinatra-contrib
  6. Passenger

Wenn es mit 1024 MB Arbeitsspeicher funktioniert, sollte die Arbeitslast auf dem Produktionsserver gering sein. Da "vagrant ssh" einen Fehler verursachen kann, wird ssh zu Beginn der Installation festgelegt.

Vagrantfile


# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"

  config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  config.vm.synced_folder "./data", "/vagrant_data"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
  end

  config.vm.provision "shell", inline: <<-SHELL
    # To solve the issue of "[email protected]: permission denied (publickey)."
    sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config; \
    sudo systemctl restart sshd;

    apt-get update
    # Installing Apache2
    apt-get install -y apache2

    # Installing Ruby & sinatra
    apt-get install -y ruby
    gem install bundler
    gem install sinatra
    gem install sinatra-contrib
    
    # [Installing Passenger + Apache on Ubuntu 18.04 LTS (with APT)]
    # (https://www.phusionpassenger.com/library/install/apache/install/oss/bionic/)
    sudo apt-get install -y dirmngr gnupg
    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
    sudo apt-get install -y apt-transport-https ca-certificates

    sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'
    sudo apt-get update

    sudo apt-get install -y libapache2-mod-passenger
    
    sudo a2enmod passenger
    sudo a2enmod headers
    sudo apache2ctl restart
  SHELL
end

Überprüfung der Installationsversion

Melden Sie sich mit vagrant ssh an, um dies zu überprüfen. Das Passwort ist "vagrant".

Apache2

Die Version von Apache2 bestimmt, ob Apache2-Einstellungen geschrieben werden sollen ("Alle erforderlich").

$ apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2020-08-12T21:33:25

Ruby

Die Ruby-Version wird auch hier als normal verwendbar bestätigt.

$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]

Der Speicherort der ausführbaren Ruby-Datei wird in den Apache2-Einstellungen (PassengerRuby / usr / bin / ruby2.5) wiedergegeben.

Ruby Gems (bundler,sinatra,sinatra-contrib)

Die folgenden Elemente wurden von der Arbeit bis zu diesem Punkt installiert.

$gem list
backports (3.18.2)
bigdecimal (default: 1.3.4)
bundler (2.1.4)
cmath (default: 1.0.0)
csv (default: 1.0.0)
date (default: 1.0.0)
dbm (default: 1.0.0)
did_you_mean (1.2.0)
etc (default: 1.0.0)
fcntl (default: 1.0.0)
fiddle (default: 1.0.0)
fileutils (default: 1.0.2)
gdbm (default: 2.0.0)
io-console (default: 0.4.6)
ipaddr (default: 1.2.0)
json (default: 2.1.0)
minitest (5.10.3)
multi_json (1.15.0)
mustermann (1.1.1)
net-telnet (0.1.1)
openssl (default: 2.1.1)
power_assert (0.2.7)
psych (default: 3.0.2)
rack (2.2.3, 1.6.4)
rack-protection (2.0.8.1)
rake (12.3.1)
rdoc (default: 6.0.1)
ruby2_keywords (0.0.2)
scanf (default: 1.0.0)
sdbm (default: 1.0.0)
sinatra (2.0.8.1)
sinatra-contrib (2.0.8.1)
stringio (default: 0.0.1)
strscan (default: 1.0.0)
test-unit (3.2.5)
tilt (2.0.10)
webrick (default: 1.4.2)
zlib (default: 1.0.0)

Passenger

Überprüfen Sie den Vorgang unter Schritt 3: Installation überprüfen.

$ sudo /usr/bin/passenger-config validate-install
What would you like to validate?
Use <space> to select.
If the menu doesn't display correctly, press '!'

 . ●  Passenger itself
   ○  Apache

-------------------------------------------------------------------------

 * Checking whether this Passenger install is in PATH... ✓
 * Checking whether there are no other Passenger installations... ✓

Everything looks good. :-)

Das Aktivieren von "Apache" erkennt es nicht. Es ist nicht erforderlich, Apache2 vom Passagier zu erkennen, daher gibt es kein Problem.

Überprüfen Sie den Speicherauslastungsstatus.

$ sudo /usr/sbin/passenger-memory-stats
Version: 6.0.6
Date   : 2020-09-03 00:07:00 +0000

--------- Apache processes ----------
PID   PPID  VMSize     Private  Name
-------------------------------------
4238  1     153.9 MB   0.5 MB   /usr/sbin/apache2 -k start
4483  4238  1268.4 MB  0.7 MB   /usr/sbin/apache2 -k start
4484  4238  1268.4 MB  0.6 MB   /usr/sbin/apache2 -k start
### Processes: 3
### Total private dirty RSS: 1.78 MB


-------- Nginx processes --------

### Processes: 0
### Total private dirty RSS: 0.00 MB


---- Passenger processes -----
PID   VMSize    Private  Name
------------------------------
4468  389.7 MB  2.3 MB   Passenger watchdog
4471  946.3 MB  3.4 MB   Passenger core
### Processes: 2
### Total private dirty RSS: 5.64 MB

Stellen Sie sicher, dass der Passagier Ruby erkennt. Siehe Bestimmen Sie den Ruby-Befehl, den der Passagier verwenden soll.

$ passenger-config about ruby-command
passenger-config was invoked through the following Ruby interpreter:
  Command: /usr/bin/ruby2.5
  Version: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]
  To use in Apache: PassengerRuby /usr/bin/ruby2.5
  To use in Nginx : passenger_ruby /usr/bin/ruby2.5
  To use with Standalone: /usr/bin/ruby2.5 /usr/bin/passenger start

The following Ruby interpreter was found first in $PATH:
  Command: /usr/bin/ruby
  Version: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]
  To use in Apache: PassengerRuby /usr/bin/ruby
  To use in Nginx : passenger_ruby /usr/bin/ruby
  To use with Standalone: /usr/bin/ruby /usr/bin/passenger start

## Notes for RVM users
Do you want to know which command to use for a different Ruby interpreter? 'rvm use' that Ruby interpreter, then re-run 'passenger-config about ruby-command'.

Denken Sie daran, dass "/ usr / bin / ruby2.5" in Apache2 festgelegt ist.

Sinatra-Anwendungskonfiguration

Um die Sinatra-App in der Apache2 + Passenger-Konfiguration auszuführen, sind in der Anwendungskonfiguration Vorsichtsmaßnahmen enthalten. Für das Anwendungsverzeichnis sind öffentliche und tmp-Verzeichnisse erforderlich. Der Inhalt kann leer sein.

/home/vagrant/sinatra$ $ ls -al
total 32
drwxr-xr-x 4 vagrant vagrant 4096 Sep  3 00:59 .
drwxr-xr-x 7 vagrant vagrant 4096 Sep  3 00:46 ..
-rw-r--r-- 1 vagrant vagrant   79 Sep  3 00:50 Gemfile
-rw-r--r-- 1 vagrant vagrant   83 Sep  3 00:59 app.rb
-rw-r--r-- 1 vagrant vagrant   63 Sep  3 00:31 config.ru
drwxr-xr-x 2 vagrant vagrant 4096 Sep  3 00:31 public
drwxr-xr-x 2 vagrant vagrant 4096 Sep  3 00:31 tmp

/home/vagrant/sinatra/Gemfile


source 'https://rubygems.org/'

gem 'sinatra'
gem 'sinatra-contrib'
gem 'rack'

/home/vagrant/sinatra/app.rb


Bundler.require

  get '/' do
    "I did it my way"
  end

/home/vagrant/sinatra/config.ru


require File.absolute_path("app.rb")

run Sinatra::Application

Führen Sie den Bundler aus und legen Sie die Anwendungsabhängigkeiten fest.

~/sinatra$ bundler install
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Using backports 3.18.2
Following files may not be writable, so sudo is needed:
  /usr/local/bin
  /var/lib/gems/2.5.0
  /var/lib/gems/2.5.0/build_info
  /var/lib/gems/2.5.0/cache
  /var/lib/gems/2.5.0/doc
  /var/lib/gems/2.5.0/extensions
  /var/lib/gems/2.5.0/gems
  /var/lib/gems/2.5.0/specifications
Using bundler 2.1.4
Using multi_json 1.15.0
Using ruby2_keywords 0.0.2
Using mustermann 1.1.1
Using rack 2.2.3
Using rack-protection 2.0.8.1
Using tilt 2.0.10
Using sinatra 2.0.8.1
Using sinatra-contrib 2.0.8.1
Bundle complete! 3 Gemfile dependencies, 10 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

OK, wenn Gemfile.lock erstellt wurde.

/home/vagrant/sinatra/Gemfile.lock


GEM
  remote: https://rubygems.org/
  specs:
    backports (3.18.2)
    multi_json (1.15.0)
    mustermann (1.1.1)
      ruby2_keywords (~> 0.0.1)
    rack (2.2.3)
    rack-protection (2.0.8.1)
      rack
    ruby2_keywords (0.0.2)
    sinatra (2.0.8.1)
      mustermann (~> 1.0)
      rack (~> 2.0)
      rack-protection (= 2.0.8.1)
      tilt (~> 2.0)
    sinatra-contrib (2.0.8.1)
      backports (>= 2.8.2)
      multi_json
      mustermann (~> 1.0)
      rack-protection (= 2.0.8.1)
      sinatra (= 2.0.8.1)
      tilt (~> 2.0)
    tilt (2.0.10)

PLATFORMS
  ruby

DEPENDENCIES
  rack
  sinatra
  sinatra-contrib

BUNDLED WITH
   2.1.4

Verknüpfen Sie ein von Apache2 erkanntes Verzeichnis.

$ sudo ln -s /home/vagrant/sinatra sinatra
$ ls -l
total 4
drwxr-xr-x 2 root root 4096 Sep  2 23:30 html
lrwxrwxrwx 1 root root   21 Sep  3 00:35 sinatra -> /home/vagrant/sinatra

Einstellungen in /etc/apache2/mods-available/passenger.conf

[Deploying an app to a sub-URI or subdirectory] Bearbeiten Sie die Konfigurationsdatei unter (https://www.phusionpassenger.com/library/deploy/apache/deploy/ruby/#deploying-an-app-to-a-sub-uri-or-subdirectory). Da bei der Installation von Passenger ### Begin bis ### End beschrieben werden, fügen Sie die Einstellungen danach hinzu. Die Einstellungselemente unterscheiden sich je nach Version des Passagiers. Seien Sie also vorsichtig, wenn Sie verschiedene Versionen des Passagiers verwenden. Geben Sie den Speicherort der ausführbaren Ruby-Datei in "PassengerRuby" an. Wenn die Version von Apache2 2.4 oder höher ist, beschreiben Sie "Alle gewährt erforderlich". Es gibt nur einen Ort, an dem RackBaseURI geschrieben werden kann, was korrekt ist.

/etc/apache2/mods-available/passenger.conf


### Begin automatically installed Phusion Passenger config snippet ###
<IfModule mod_passenger.c>
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/passenger_free_ruby
</IfModule>
### End automatically installed Phusion Passenger config snippet ###

PassengerRuby /usr/bin/ruby2.5
RackBaseURI /sinatra

Alias /sinatra /var/www/sinatra/public
<Location /sinatra>
  PassengerBaseURI /sinatra
  PassengerAppRoot /var/www/sinatra
</Location>
<Directory /var/www/sinatra/public>
  Allow from all
  Options -MultiViews
  Require all granted
</Directory>

Neustart von Apache2

$ sudo service apache2 restart

Überprüfen Sie den Status für alle Fälle.

$ sudo service apache2 status
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Thu 2020-09-03 00:25:40 UTC; 47s ago
  Process: 4811 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 4817 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 2595 (code=exited, status=0/SUCCESS)
    Tasks: 73 (limit: 1152)
   CGroup: /system.slice/apache2.service
           ├─4871 /usr/sbin/apache2 -k start
           ├─4874 Passenger watchdog
           ├─4878 Passenger core
           ├─4892 /usr/sbin/apache2 -k start
           └─4893 /usr/sbin/apache2 -k start

Sep 03 00:25:40 ubuntu-bionic systemd[1]: Starting The Apache HTTP Server...
Sep 03 00:25:40 ubuntu-bionic apachectl[4817]: AH00558: apache2: Could not reliably determine the server's fully qualified d
Sep 03 00:25:40 ubuntu-bionic systemd[1]: Started The Apache HTTP Server.

Passagier läuft auch.

Funktionsprüfung

Zunächst die Haupt-App. 20200903_main_app.png

Überprüfen Sie die Funktion von Sinatra. 20200903_sinatra_1.png

Wenn es nicht funktioniert, wird ein Fehlerbildschirm angezeigt. 20200903_error.png

Wenn Sie nicht einmal den Passagierfehlerbildschirm sehen, haben Sie den Passagier überhaupt nicht erreicht. Es besteht die Möglichkeit einer Fehlkonfiguration von Apache2 selbst. Wenn Sie eine Fehlermeldung erhalten, überprüfen Sie / var / log / apache2 / error.log.

Aufgabe

Die Punkte, die aufgrund mangelnder Studien nicht gelöst wurden, sind wie folgt.

  1. Ich kenne Bundler nicht. Sie müssen nicht gem install sinatra machen.
  2. Sinatra lädt nicht automatisch neu. Ist es nicht genug, nur Inatra-Contrib'in in die Gemfile zu schreiben?
  3. Platzierung der Sinatra App. Seien Sie vorsichtig mit der Sicherheit öffentlicher Dienste.
  4. Sinatra App Authentifizierungsprozess.
  5. So rufen Sie Rust-Funktionen von Sinatra (Ruby) über FFI auf.

Recommended Posts

Erstellen Sie eine REST-API mit Apache2 + Passenger + Sinatra.
Hallo Welt (REST API) mit Apache Camel + Spring Boot 2
REST-API-Test mit REST Assured
REST-API-Test mit REST Assured Part 2
FileUpload mit Rest auf Apache Wicket
Sinatra App mit ActiveRecord starb in Passenger 6.0.5
So erstellen Sie eine API mit GraphQL und Rails
[Spring Boot] Benutzerinformationen mit Rest API abrufen (Anfänger)
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).
Build Rails (API) x MySQL x Nuxt.js Umgebung mit Docker
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 1).
Kompatibel mit Android 10 (API 29)
Baue Doma1 mit Ant
Baue Growai mit Centos7
Informationen zur Apache Inference API
Erstellen Sie Java mit Wercker
Bazel mit Alpen bauen
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Elasticsearch-Vorgang über die REST-API mit Apache HttpClient in Java
Was ich mit der Redmine REST API süchtig gemacht habe
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0
Sprechen Sie über das Hochladen von Dateien mithilfe der Slack-API mit Apache HttpPost