J'utilise Ubuntu Hardy 8.04 et nginx 0.7.65, et lorsque j'essaie de démarrer mon serveur nginx:
$ Sudo /etc/init.d/nginx start
Je reçois l'erreur suivante:
Starting nginx: [emerg]: bind() to IP failed (99: Cannot assign requested address)
où "IP" est un espace réservé pour mon adresse IP. Est-ce que quelqu'un sait pourquoi cette erreur pourrait se produire? Ceci fonctionne sur EC2.
Mon fichier nginx.conf ressemble à ceci:
user www-data www-data;
worker_processes 4;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /usr/local/nginx/logs/access.log;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 3;
gzip on;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml
application/xml+rss text/javascript;
include /usr/local/nginx/sites-enabled/*;
}
et mon /usr/local/nginx/sites-enabled/example.com ressemble à:
server {
listen IP:80;
server_name example.com;
rewrite ^/(.*) https://example.com/$1 permanent;
}
server {
listen IP:443 default ssl;
ssl on;
ssl_certificate /etc/ssl/certs/myssl.crt;
ssl_certificate_key /etc/ssl/private/myssl.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP;
server_name example.com;
access_log /home/example/example.com/log/access.log;
error_log /home/example/example.com/log/error.log;
}
Avec Amazon EC2 et les adresses IP élastiques, le serveur ne connaît pas son adresse IP comme avec la plupart des autres serveurs.
Vous devez donc indiquer à votre Linux d'autoriser les processus à se lier à une adresse non locale. Ajoutez simplement la ligne suivante dans le fichier /etc/sysctl.conf
:
# allow processes to bind to the non-local address
# (necessary for Apache/nginx in Amazon EC2)
net.ipv4.ip_nonlocal_bind = 1
puis rechargez votre sysctl.conf en:
$ sysctl -p /etc/sysctl.conf
qui sera bien sur les redémarrages.
Pour éviter de coder en dur l'adresse IP dans la configuration, procédez comme suit:
listen *:80
En tant que kirpit mentionné ci-dessus, vous souhaiterez permettre aux processus linux de se lier à une adresse IP locale:
nano /etc/sysctl.conf
# allow processes to bind to the non-local address
net.ipv4.ip_nonlocal_bind = 1
sysctl -p /etc/sysctl.conf
Ensuite, vous souhaitez ajouter l'adresse IP privée qui est associée à votre adresse IP élastique et l'ajouter à la configuration de vos sites:
nano /etc/nginx/sites-available/example.com
Recharger nginx:
service nginx reload
Terminé!
Si vous utilisez Network Manager, vous devez attendre avant de lancer le service avant de lancer le service:
systemctl activer NetworkManager-wait-online.service
Avec Amazon EC2 et les adresses IP élastiques, le serveur ne connaît pas son adresse IP comme avec la plupart des autres serveurs. Ainsi, dans les fichiers d’hôte virtuel Apache, vous devez au moins indiquer *: 80 plutôt que votre adresse IP élastique: 80.
Ensuite cela fonctionne correctement. Donc théoriquement, faire *: 80 pour nginx devrait fonctionner de la même manière, mais vous obtiendrez [émerg]: bind () avec 0.0.0.0:80 en échec (98: adresse déjà utilisée). Je n'ai pas encore trouvé de solution ..
Pour les personnes qui pourraient être confrontées à cela à l'avenir, j'ai simplement consulté mon adresse IP privée dans l'instance AWS et je suis lié à cela. J'ai vérifié que nginx était capable d'écouter publiquement et d'effectuer ma réécriture après cela. Je ne pouvais pas faire *: PORT car j'avais un serveur interne auquel je mandatais.
Il se peut qu’il reste un processus/programme qui utilise/écoute sur le port 80.
Vous pouvez vérifier cela en utilisant netstat -lp. Tuez ce processus et lancez nginx.