Configurez uwsgi et nginx à l’aide de Docker

J’ai configuré uwsgi et nginx séparément pour un serveur de production python en suivant ce lien . Je les ai configurés séparément avec la configuration de travail. Mon seul uwsgi fonctionne très bien et nginx seul fonctionne bien. Mon problème est que je uwsgi d’utiliser docker pour cette configuration et que je ne suis pas capable d’exécuter simultanément uwsgi et nginx , même si j’utilise un fichier bash. Vous trouverez ci-dessous les parties pertinentes de ma configuration.

Dockerfile :

  #python setup RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN rm /etc/nginx/sites-enabled/default RUN ln -s mysite.conf /etc/nginx/sites-enabled/ EXPOSE 80 CMD ["/bin/bash", "start.sh"] 

mysite.conf

 upstream django { # server unix:///path/to/your/mysite/mysite.sock; # for a file socket server 127.0.0.1:8001; # for a web port socket } server { listen 80; server_name aa.bb.cc.dd; # ip address of the server charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste location / { uwsgi_pass django; include /etc/nginx/uwsgi_params; # the uwsgi_params file } } 

start.sh :

 service nginx status uwsgi --socket :8001 --module server.wsgi service nginx restart service nginx status # ------- > doesn't get executed :( 

sortie du fichier shell

entrer la description de l'image ici

Quelqu’un peut-il m’aider comment configurer cela en utilisant un script bash?

Votre script start.sh risque de se terminer immédiatement après l’exécution de ces deux commandes.
Cela mettrait fin au conteneur juste après le démarrage.

Vous devez au moins vous assurer que la commande nginx start ne se ferme pas tout de suite.
L’ image officielle de nginx utilise :

  nginx -g daemon off; 

Une autre approche consisterait à conserver votre script tel /etc/supervisor/conf.d/supervisord.conf , mais à utiliser pour CMD un superviseur , en déclarant votre script dans /etc/supervisor/conf.d/supervisord.conf .
De cette façon, vous ne vous exposez pas au ” problème de récolte de zombies PID 1 “: arrêter votre conteneur attend la fin des deux processus avant de quitter.

Je pense qu’il y a une alternative très simple mais importante à souligner.

Votre scénario initial était:

  • Environnement de production .
  • Uwsgi et nginx fonctionnent bien seuls .
  • Socket TCP pour uwsgi <=> communication nginx.

Je ne pense pas que vous devriez aller avec un truc compliqué pour exécuter les deux processus dans le même conteneur.

Vous devez simplement exécuter uwsgi et nginx dans des conteneurs séparés.

De cette façon, vous réalisez:

  1. Isolation fonctionnelle : Si vous souhaitez remplacer Nginx par Apache, vous n’avez pas besoin de modifier / reconstruire / redéployer votre conteneur uwsgi.
  2. Isolation des ressources : Vous pouvez limiter la mémoire, le processeur et les E / S séparément pour nginx et uwsgi.
  3. Couplage libre : Si vous le souhaitez, vous pouvez même déployer les conteneurs sur des machines distinctes (il vous suffit de configurer votre serveur URI pour qu’il soit configurable).