Exemple d'image du serveur d'API Python pour EC2 (AMI publique)

Une note sur ma propre AMI lors de la création d'un serveur API avec Python. Je n'aime pas les portes dérobées, donc je ne pense pas que les autres les utiliseront, mais si quelqu'un les utilise, veuillez le faire à vos risques et périls.

Je vous serais reconnaissant si vous pouviez signaler les mauvais paramètres.

nginx, gunicorn est inclus.

En gros, gunicorn est démarré sur le port 8000 en utilisant Upstart, et le proxy inverse est effectué avec nginx.

Il est créé en supposant que plusieurs projets seront hébergés en tant que serveur de développement, et la structure de dossiers pour chaque projet est la suivante.

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

www est l'utilisateur exécutant * nginx * ou le serveur API. On a l'impression que le nombre de dossiers «un domaine» augmente pour chaque projet.

Comment démarrer le serveur

L'ID AMI public est ʻami-24486d4a`. Je dois m'assurer de ne pas insérer accidentellement une AMI différente.

Ouvrez la console EC2.

Cliquez sur AMI dans le menu de gauche, définissez la barre de recherche d'image sur * image publique *, et saisissez ʻami-24486d4a` dans le champ de recherche pour faire apparaître l'image.

Cliquez avec le bouton droit pour commencer.

Ce que vous avez installé

chez miam

Réglage

Les fichiers falsifiés sont les suivants.

Paramètres du serveur Web (nginx)

Paramètres du corps du serveur

/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;

}

J'ai oublié de supprimer l'option selon laquelle la version du serveur est incluse dans la réponse, j'ai donc ajouté ce paramètre dans la directive http.

    server_tokens off;

Mettons à jour l'AMI lorsque les corrections sont collectées.

Paramètres d'hôte virtuel

Même si vous utilisez CloudFlare, l'adresse IP d'origine est définie de manière à ne pas changer. Pour plus d'informations, cliquez ici (https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx-).

__pull_from_bitbucket réduit la source d'accès par l'adresse IP de * Bitbucket * lors du déploiement avec Bitbucket. Si vous n'utilisez pas Bitbucket, désactivez-le.

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;
    } 
}

Paramètres du serveur API (gunicorn avec Upstart)

GITHUB_HOOK_SECRET est une variable d'environnement utilisée lors du Déploiement avec GitHub. Lorsque vous n'utilisez pas GitHub, supprimez-le.

/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

Exemple d'application

Le dossier pour le contenu statique est web, et le dossier pour Python est ʻapi_server`.

Démarrez et arrêtez le serveur

démarrer / arrêter nginx

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

#Arrêtez
sudo /etc/init.d/nginx stop

#Redémarrer
sudo /etc/init.d/nginx restart

démarrer / arrêter gunicorn

#Commencez
sudo start somedomain-api-server

#Arrêtez
sudo stop somedomain-api-server

#Redémarrer
sudo restart somedomain-api-server

Procédure d'ajout d'un hôte virtuel

  1. Devenez un utilisateur www, créez un dossier pour votre projet et placez des fichiers Python ou Web.
  2. Configurez le serveur API. ([Référence](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. Configurez le serveur Web. ([Référence](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. Si nécessaire, configurez la liaison de déploiement GitHub et Bitbucket.

Recommended Posts

Exemple d'image du serveur d'API Python pour EC2 (AMI publique)
Exemple d'API Google Cloud Vision pour python
Traitement d'image? L'histoire du démarrage de Python pour
Appuyez sur les exemples v20-python-samples de la bibliothèque d'encapsuleurs d'API REST OANDA v20 pour Python
Liste d'exemples de sites de distribution de programmes pour les livres Python
Construisez un serveur API pour vérifier le fonctionnement de l'implémentation frontale avec python3 et Flask
Exemple d'utilisation de pickle Python
[Python] Exemple de code pour la grammaire Python
Serveur HTTP simple pour python
Exemple à utiliser après l'authentification OAuth de l'API BOX avec Python
J'ai créé une bibliothèque de wrapper Python pour l'API de reconnaissance d'images docomo.
Capture d'image de Firefox en utilisant Python
Exemple d'API Boto3 (Python) que j'utilise souvent
Notes personnelles pour le traitement d'images python
Image de conteneur recommandée pour les applications Python
Comportement de python3 par le serveur de Sakura
Premiers pas avec python3
Enregistrement de l'introduction de Python pour les nouveaux arrivants
Mémo de l'opération de position de pixel pour les données d'image avec Python (numpy, cv2)
Exécuter un lot de Python 2.7 avec nohup sur Amazon Linux AMI sur EC2
Bases du traitement d'images binarisées par Python
Python: principes de base de la reconnaissance d'image à l'aide de CNN
Exemple PHP / Python / Ruby frappant l'API Path
Python: Application de la reconnaissance d'image à l'aide de CNN
Résumé de diverses instructions for en Python
[Python] Calcul de la similarité d'image (coefficient de dés)
Échelle de gris par matrice-Reinventor of Python image processing-
Pandas du débutant, par le débutant, pour le débutant [Python]
Exemple de gestion des fichiers eml en Python
Dessin avec Matrix-Reinventor of Python Image Processing-
Résumé des techniques utiles de Scrapy en Python
Analyse d'image de microtomographie à rayons X par Python
Implémentation du wrapper Python pour l'API Qiita v2
Filtrage par convolution par matrice-Reinventor of Python image processing-
Exemple de conversion en ondelettes d'images en Python
Installez l'API Python du simulateur de conduite automatique LGSVL et exécutez un exemple de programme