Beispielbild eines Python-API-Servers für EC2 (öffentliches AMI)

Ein Hinweis zu meinem eigenen AMI beim Erstellen eines API-Servers mit Python. Ich möchte keine Hintertür haben, daher denke ich nicht, dass sie von anderen benutzt wird, aber wenn jemand sie benutzt, tun Sie dies bitte auf eigenes Risiko.

Ich würde mich freuen, wenn Sie auf schlechte Einstellungen hinweisen könnten.

Nginx, Gunicorn ist enthalten.

Grob gesagt wird Gunicorn auf Port 8000 mit Upstart gestartet, und Reverse Proxy wird mit Nginx ausgeführt.

Es wird unter der Annahme erstellt, dass mehrere Projekte als Entwicklungsserver gehostet werden und die Ordnerstruktur für jedes Projekt wie folgt lautet.

/home/www/
└── somedomain
    ├── api_server
    │   ├── virtualenv
    │   ├── pip.txt
    │   └── python
    │       └── server.py
    └── web
        └── htdocs
            └── index.html

"www" ist der Benutzer, auf dem * nginx * oder der API-Server ausgeführt wird. Es fühlt sich so an, als würde die Anzahl der "Somedomain" -Ordner mit jedem Projekt zunehmen.

So starten Sie den Server

Die öffentliche AMI-ID lautet "ami-24486d4a". Ich muss sicherstellen, dass ich nicht versehentlich einen anderen AMI einfüge.

Öffnen Sie die EC2-Konsole.

Klicken Sie im linken Menü auf AMI, setzen Sie die Bildsuchleiste auf * öffentliches Bild * und geben Sie "ami-24486d4a" in das Suchfeld ein, um das Bild aufzurufen.

Klicken Sie mit der rechten Maustaste, um zu starten.

Was Sie installiert haben

bei yum

Aufbau

Die manipulierten Dateien lauten wie folgt.

Webserver-Einstellungen (Nginx)

Serverkörpereinstellungen

/etc/nginx/nginx.conf


user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;


events {
    worker_connections 1024;
}

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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;

    keepalive_timeout   65;
    types_hash_max_size 2048;

    include /etc/nginx/conf.d/*.conf;

    index   index.html index.htm;

}

Ich habe vergessen, die Option zu entfernen, dass die Serverversion in der Antwort enthalten ist, und habe diese Einstellung in der http-Direktive hinzugefügt.

    server_tokens off;

Lassen Sie uns den AMI aktualisieren, wenn die Korrekturen gesammelt wurden.

Einstellungen für virtuelle Hosts

Selbst wenn Sie CloudFlare verwenden, wird die ursprüngliche IP so festgelegt, dass sie sich nicht ändert. Weitere Informationen finden Sie hier (https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx-).

__pull_from_bitbucket schränkt die Zugriffsquelle durch die IP-Adresse von * Bitbucket * bei [Bereitstellung mit Bitbucket] ein (http://qiita.com/polikeiji/items/fc6f9bbe7a619a053319). Wenn Sie Bitbucket nicht verwenden, schalten Sie es aus.

nginx:/etc/nginx/conf.d/somedomain.conf


upstream somedomain_api_server {
    server 127.0.0.1:8000 fail_timeout=0;
}

server {
    listen       80;
    server_name  somedomain;
    root         /home/www/somedomain/web/htdocs;

    #charset koi8-r;

    # for CloudFlare
    set_real_ip_from 199.27.128.0/21;
    set_real_ip_from 173.245.48.0/20;
    set_real_ip_from 103.21.244.0/22;
    set_real_ip_from 103.22.200.0/22;
    set_real_ip_from 103.31.4.0/22;
    set_real_ip_from 141.101.64.0/18;
    set_real_ip_from 108.162.192.0/18;
    set_real_ip_from 190.93.240.0/20;
    set_real_ip_from 188.114.96.0/20; 
    set_real_ip_from 197.234.240.0/22;
    set_real_ip_from 198.41.128.0/17;
    set_real_ip_from 162.158.0.0/15;
    set_real_ip_from 104.16.0.0/12;
    set_real_ip_from 172.64.0.0/13;
    set_real_ip_from 2400:cb00::/32;
    set_real_ip_from 2606:4700::/32;
    set_real_ip_from 2803:f800::/32;
    set_real_ip_from 2405:b500::/32;
    set_real_ip_from 2405:8100::/32;
    real_ip_header CF-Connecting-IP;

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

    location /__pull_from_bitbucket {
        satisfy any;
        allow 131.103.20.160/27;
        allow 165.254.145.0/26;
        allow 104.192.143.0/24;
        allow 220.156.98.58/32;
        deny all;

        try_files $uri $uri/ @proxy_to_app;
    }

    location / {
        try_files $uri $uri/ @proxy_to_app;

        add_header Cache-Tag main;
    }

    location @proxy_to_app {
        satisfy any;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        #proxy_buffering off;
        proxy_pass   http://somedomain_api_server;
    } 
}

API-Servereinstellungen (Gunicorn mit Upstart)

GITHUB_HOOK_SECRET ist eine Umgebungsvariable, die beim [Bereitstellen mit GitHub] verwendet wird (http://qiita.com/polikeiji/items/fc6f9bbe7a619a053319). Wenn Sie GitHub nicht verwenden, löschen Sie es.

/etc/init/somedomain-api-server.conf


description "Somedomain API Server"

start on runlevel [2345]
stop on runlevel [016]

# GitHub Hook Secret
env GITHUB_HOOK_SECRET=""

respawn
exec /home/www/somedomain/api_server/virtualenv/bin/gunicorn -b 127.0.0.1:8000 -w 4 -u www --chdir /home/www/somedomain/api_server/python --log-file /home/www/somedomain/api_server/logs/error_log --pythonpath /home/www/somedomain/api_server/python server:application

Beispiel App

Der Ordner für statischen Inhalt ist "web" und der Ordner für Python ist "api_server".

Starten und stoppen Sie den Server

Nginx starten / stoppen

#Anlaufen
sudo /etc/init.d/nginx start

#Halt
sudo /etc/init.d/nginx stop

#Starten Sie neu
sudo /etc/init.d/nginx restart

Gunicorn starten / stoppen

#Anlaufen
sudo start somedomain-api-server

#Halt
sudo stop somedomain-api-server

#Starten Sie neu
sudo restart somedomain-api-server

Vorgehensweise zum Hinzufügen eines virtuellen Hosts

  1. Werden Sie ein WWW-Benutzer, erstellen Sie einen Ordner für Ihr Projekt und platzieren Sie Python- oder Webdateien.
  2. Richten Sie den API-Server ein. ([Referenz](http://qiita.com/polikeiji/items/51052ab6df169287a922#api%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE] % E8% A8% AD% E5% AE% 9Aupstart% E3% 81% A7gunicorn))
  3. Richten Sie den Webserver ein. ([Referenz](http://qiita.com/polikeiji/items/51052ab6df169287a922#web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE % E8% A8% AD% E5% AE% 9Anginx))
  4. Richten Sie bei Bedarf die GitHub- und Bitbucket-Bereitstellungsverknüpfung ein.

Recommended Posts

Beispielbild eines Python-API-Servers für EC2 (öffentliches AMI)
Google Cloud Vision API-Beispiel für Python
Bildverarbeitung? Die Geschichte, Python für zu starten
Berühren Sie die Beispiel-v20-Python-Beispiele der OANDA v20-REST-API-Wrapper-Bibliothek für Python
Liste der Verteilungsseiten für Beispielprogramme für Python-Bücher
Erstellen Sie einen API-Server, um den Betrieb der Front-Implementierung mit Python3 und Flask zu überprüfen
Beispiel für die Verwendung von Python Pickle
[Python] Beispielcode für die Python-Grammatik
Einfacher HTTP-Server für Python
Beispiel zur Verwendung nach OAuth-Authentifizierung der BOX-API mit Python
Ich habe eine Python-Wrapper-Bibliothek für die Docomo-Bilderkennungs-API erstellt.
Bilderfassung von Firefox mit Python
Boto3 (Python) API-Beispiel, das ich oft benutze
Persönliche Notizen für die Python-Bildverarbeitung
Empfohlenes Container-Image für Python-Anwendungen
Verhalten von Python3 durch Sakuras Server
Erste Schritte mit Python3
Aufzeichnung der Python-Einführung für Neulinge
Notiz der Pixelpositionsoperation für Bilddaten mit Python (numpy, cv2)
Führen Sie einen Stapel Python 2.7 mit nohup unter Amazon Linux AMI unter EC2 aus
Grundlagen der binärisierten Bildverarbeitung durch Python
Python: Grundlagen der Bilderkennung mit CNN
PHP / Python / Ruby-Beispiel für die Pfad-API
Python: Anwendung der Bilderkennung mit CNN
Zusammenfassung verschiedener for-Anweisungen in Python
[Python] Berechnung der Bildähnlichkeit (Würfelkoeffizient)
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Beispiel für den Umgang mit EML-Dateien in Python
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Zusammenfassung nützlicher Techniken von Scrapy in Python
Analyse des Röntgenmikrotomographiebildes durch Python
Implementierter Python-Wrapper für Qiita API v2
Faltungsfilterung durch Matrix-Reinventor der Python-Bildverarbeitung-
Beispiel für die Wavelet-Konvertierung von Bildern in Python
Installieren Sie die Python-API des automatischen Fahrsimulators LGSVL und führen Sie das Beispielprogramm aus