Postez ici vos trucs & astuces.
Répondre

installation configuration d'un serveur web [nginx]

#1Messageil y a 8 ans

Installation manuelle (et personnelle) d'une configuration
Manjaro - Nginx - Mariadb - Php (Mnmp pas génial comme nom )

Nginx plutôt que apache ? nginx est beaucoup plus rapide et, plus léger en ressources; aucune raison d'utiliser un bulldozer sur mon propre poste sans raison.
Apache est très bien si vous avez 100 sites sur votre machine ...

ps: a suivre un script qui fera tous cela automatiquement pour les pressés ... mais il est plus intéressant de comprendre :clindoeil:

--------------------------
1- Le serveur web:
--------------------------

note: il est préférable de se connecter directement en root (su) pour toutes les opérations suivantes.

pacman -S nginx php-fpm php-gd php-mcrypt

nous allons créer notre propre fichier php.ini pour ne pas avoir de .pacnew lors des mise à jour.

touch /etc/php/conf.d/php.ini
nano  /etc/php/conf.d/php.ini


[php]
memory_limit = 600M

; dossiers ou il est possible d’exécuter des script php (séparateur :)
open_basedir = /var/http/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/

; si l'on installe ssmtp pour envoyer des email depuis php
;sendmail_path = /usr/sbin/ssmtp -t

; ne pas montrer que les scripts utilisent php et surtout quelle version
expose_php = Off

; limiter les uploads
post_max_size = 4M
upload_max_filesize = 4M
max_file_uploads = 5

; extensions php utilisées
extension=mcrypt.so
extension=pdo_mysql.so


Faire un php-v pour contrôler si aucune erreur/warning apparaît, sinon corriger notre conf.d/php.ini
A cette étape, il est possible d'installer d'autres extensions php-XXXXX via pacman et de les activer dans notre php.ini

-----------------------------------------
notre serveur est par défaut dans le répertoire : /srv/http/ mais ici nous allons utiliser plutôt /var/http/ qui sera un lien symbolique vers notre répertoire

ln -s /srv/http /var/http 
chown root:http -R /var/http

une des autres possibilité : ln -s /home/http /var/http
note: le serveur web est "http", en donnant un groupe "http" au site, il est alors facile de donner un accès à nginx en écriture avec un chmod; beaucoup de services web ont besoin d'un accès en écriture sur un ou plusieurs dossiers. C'est une des bonnes façon de faire...

--------------------------
2- Configuration rapide de test de nginx
--------------------------
Etape intermédiaire optionnelle, nous allons surtout tester si php est bien installé
note: nginx prend en compte les modifications de configuration uniquement après avoir été relancé.

sudo nano /etc/nginx/nginx.conf


#user http;
worker_processes  2;

events {
    worker_connections  1024;
}

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

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        root /var/http;

        location / {
            index  index.php index.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location ~ \.php$ {
            include             fastcgi.conf;
            fastcgi_pass        unix:/run/php-fpm/php-fpm.sock;
        }
    }
}


pour un rapide test créons un contenu

echo  "<?php phpinfo(); ?>" >/var/http/index.php 


Démarrer php :

systemctl start php-fpm
démarrer le serveur web
systemctl start nginx


le test avec votre navigateur http://localhost/ ou en ligne de commande curl localhost


--------------------------
3- Configuration réelle de notre serveur nginx
--------------------------

voila notre serveur fonctionne bien, mais il peut-être intéressant d'utiliser vhost; cela permet de bien différencier chaque configuration et de placer différents services indépendants à la racine, par exemple
http://intranet # notre serveur par défaut
http://db.intranet # accès à mariadb
http://git.intranet # notre serveur git
http://owncloud.intranet # cloud local
http://owncloud # même cloud

la structure sur disque de notre serveur devient :
/var/http/intranet/www
/var/http/db.intranet/www
/var/http/owncloud.intranet/www

Modifions notre fichier /etc/hosts, on ajoute par exemple :

127.0.0.1   intranet db.intranet git.intranet owncloud.intranet


Configuration "façon apache" de nginx:

créer des répertoires pour la configuration de nos hôtes :

mkdir /etc/nginx/sites-enabled
mkdir /etc/nginx/sites-available
nous allons ranger nos sites disponibles dans sites-available

avant cela recréons notre fichier /etc/nginx.conf qui va maintenant uniquement parcourir un dossier

#user http;
worker_processes  4;
events {
    worker_connections  1024;
}
http {
   include /etc/nginx/conf.d/*.conf;
   include /etc/nginx/sites-enabled/*;
}


notre serveur web est maintenant prêt, il ne reste plus qu'a créer un fichier de configuration par site(service).

note: nginx prend en compte les modifications de configuration uniquement après avoir été relancé.

pour http://intranet/, notre accès par défaut
il sera dans /var/http/intranet/www
son fichier de configuration : /etc/nginx/sites-enabled/intranet
son activation : un lien symbolique de la configuration /etc/nginx/sites-available/intranet

créer le fichier /etc/nginx/sites-enabled/intranet:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/http/intranet/www;
        server_name intranet;

        index index.php index.html index.htm;

        location / {
                # pas sécure : on affiche la liste des fichiers si pas d'index
                autoindex on;
        }

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_pass  unix:/run/php-fpm/php-fpm.sock;
        }
}

Activer le site par défaut :

ln -s /etc/nginx/sites-available/intranet /etc/nginx/sites-enabled/intranet


Pour les autres, cela dépend de chaque logiciel installé, il faut surtout changer les variables :
root /var/html/XXXXXX.intranet/www
server_name XXXXXX.intranet
et
listen 80;
listen [::]:80;
penser à les activer : ln -s /etc/nginx/sites-available/XXXX /etc/nginx/sites-enabled/XXXX
pour désactiver un service : rm /etc/nginx/sites-enabled/XXXX

chaque service dans sa documentation donne sont propre nginx.conf, avec cette configuration, toutes les configurations sont séparées et surtout vous n'avez pas un seul fichier de config usine à gaz.


--------------------------
4 - les bases de données
--------------------------

le plus simple, optionnel :

pacman -S mariadb

sécuriser un minimum le serveur de base de données : limiter les requêtes uniquement à notre machine (127.0.0.1)

sudo nano  /etc/mysql/my.cnf

après [mysqld] ajouter la ligne

bind-address = 127.0.0.1

wiki arch : https://wiki.archlinux.fr/MariaDB


nous allons de plus nous installer un logiciel pour administrer nos bases de données
mkdir -p /var/http/db.intranet/www/
télécharger depuis le site : https://www.adminer.org/
le copier dans son répertoire :
sudo cp ~/Téléchargements/adminer-*.php /var/http/db.intranet/www/index.php
Après le contenu, comme vu plus haut, on passe à la configuration
nano /etc/nginx/sites-available/db.intranet :

server {
        listen 80;
        listen [::]:80;
        root /var/http/db.intranet/www;
        server_name db.intranet;
        index index.php;
        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_pass  unix:/run/php-fpm/php-fpm.sock;
        }
}

ln -s /etc/nginx/sites-available/db.intranet /etc/nginx/sites-enabled/db.intranet
penser a ajouter db.intranet dans /etc/hosts

et on reboote le serveur : systemctl restart nginx

--------------------------
5- fin
--------------------------

en cas d'erreur, penser à regarder les logs :

journalctl -u nginx --since="-10m"


Si nous avons très souvent besoins de notre site web, ou que cette installation est sur un serveur, alors il faut lancer le service http automatiquement dès le démarrage via systemd.

systemctl enable php-fpm
systemctl enable nginx

ps: si un service utilise des bases de données, alors il faudra aussi lancer le service adéquat (mysql,...)

installation configuration d'un serveur web [nginx]

#2Messageil y a 8 ans

pressé, alors voici le script pour installer/configurer nginx sans prise de tête (normalement!) et très rapidement
Attention si vous avez déjà nginx d'installé il va vous supprimer les configurations existantes :furieux:

nginx-set.sh :

#!/usr/bin/env bash
pkgname='nginx-set'
version=0.1.1 # 28/02/2016

# test in asset function
unset DEVELOPER PARAMS ADMIN CONFIG
#PARAMS=1
ADMIN=1

#general install directories
declare -A DIRS=()
DIRS[local]="$HOME/.config/${pkgname}.conf"
error_file="/tmp/$pkgname.err"

#save script arguments
#declare -a ARGS=("$@")

## constantes chaines fr {{{
#sources $DIRS[dico]
declare -Ar _DICO=(
    ['Usage']='usage'
    ['info']='information'
    ['yes']='oui'
    ['no']='non'
    ['%s already installed']='%s déjà installé'
)
# }}}

#########################

_txt() {
 local param="$1"
 shift
 [[ -n "${_DICO[$param]}" ]] && param="${_DICO[$param]}"
 printf "$param" "$@"
}

function usage()
{
   echo "Usage: "
   #echo  "    -i: intallation "
   echo  "    -s: ajout d'un serveur"
}


function asset()
{
  local E_PARAM_ERR=128
  local E_ASSERT_FAILED=99
  local msg="Error"
 
  ((PARAMS)) && {
   (( $# < 1 )) && {
      echo "expected argument"
      usage
      exit $E_PARAM_ERR
   }
   }      

  ((ADMIN)) && {
   (($EUID != 0)) && {
      echo "you cannot perform this operation unless you are root."
      exit 126
   }
  }
}

function init_paths()
{
    lg=$(locale 2>/dev/null | awk -F'=' '/^LANG/ {print $2}')   
    DIRS[dico]="/usr/share/locale/${lg:0:2}/LC_MESSAGES/$pkgname"     
   
    # if in $DIRS[local] we have DEVELOPER=1
    # files loaded from curent directori and not from install directories
    ((DEVELOPER)) && {
      local path=$(dirname $0)
        DIRS[dico]="${path}${DIRS[dico]}"
    }
}

#################################

nginx_install() {
    local pkg='nginx'
    if (pacman -Qq "${pkg}" &>/dev/null); then
        echo "$(_txt '%s already installed' ${pkg})"
    else
        pacman -S ${pkg}
    fi
}
php_install() {
    local pkg='php-fpm'
    if (pacman -Qq "${pkg}" &>/dev/null); then
        echo "$(_txt '%s already installed' ${pkg})"
    else
        pacman -S ${pkg} php-gd php-mcrypt --needed
    fi
}

nginx_setdirs() {
    if [ ! -d '/srv/http' ]; then
        mkdir -p /srv/http --mode=760
    fi
    ln -s /srv/http /var/http
    chown root:http -R /var/http
    mkdir /etc/nginx/sites-enabled 2>/dev/null
    mkdir /etc/nginx/sites-available 2>/dev/null
}

nginx_config() {
    nginx_setdirs
    echo "#user http;
worker_processes  4;
events {
   worker_connections  1024;
}
http {
   server_names_hash_bucket_size 128;
   include /etc/nginx/conf.d/*.conf;
   include /etc/nginx/sites-enabled/*;
}">/etc/nginx/nginx.conf
    systemctl restart nginx
}

php_config(){
    echo "[php]
memory_limit = 600M

; dossiers ou il est possible d'executer des script php (séparateur :)
open_basedir = /var/http/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/

; si l'on installe ssmtp pour envoyer des email depuis php
;sendmail_path = /usr/sbin/ssmtp -t

; ne pas montrer que les scripts utilisent php et surtout quelle version
expose_php = Off

; limiter les uploads
post_max_size = 4M
upload_max_filesize = 4M
max_file_uploads = 5

; extensions php complementaires utilisées
extension=mcrypt.so
extension=pdo_mysql.so
">/etc/php/conf.d/php.ini
    systemctl restart php-fpm
}

#################################

server_add() {
    local server="$1"
    [ -z "${server}" ] && return 128
    mkdir -p "/var/http/${server}/www"
    echo  "<?php phpinfo(); ?>" >"/var/http/${server}/www/index.php"
    chown root:http -R "/var/http/${server}"
    echo "server {
        listen 80;
        listen [::]:80;
        root /var/http/${server}/www;
        server_name ${server};
        index index.php index.html index.htm;

        location / {
                # pas sécure : on affiche la liste des fichiers si pas d'index
                autoindex on;
        }
        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_pass  unix:/run/php-fpm/php-fpm.sock;
        }
}">"/etc/nginx/sites-available/${server}"
    echo "Ajouter nanuellement ${server} à votre fichier /etc/hosts"
    ln -s "/etc/nginx/sites-available/${server}" "/etc/nginx/sites-enabled/${server}"
    echo "serveur ${server} installé"
    systemctl restart nginx
}
function setservers(){
    serversdispo
    local server
    while true; do
        echo
        echo -n "Serveur à créer (ex: db.intranet): "
        read server
        server_add "$server"
        (($? !=0)) && break
    done
}

serversdispo() {
    echo "Services disponibles:"
    for www in /etc/nginx/sites-enabled/*; do
        line=$(grep -v '#' $www | grep -E "^[[:blank:]].*server_name")
        line=${line/server_name/}
        line=${line//   /}
        [ -n "$line" ] &&   echo -e "$CG  ● ${CB}http://${line// /}$CE"
    done
    echo
}

#################################

run()
{
    nginx_install
    php_install
   
    php_config
    nginx_config
   
    setservers
   
    serversdispo
}

# load files / configuration
main()
{
   init_paths
   [ -r "${DIRS[dico]}" ] && source "${DIRS[dico]}"

   SHORT=hs
   LONG=help,server
   PARSED=$(getopt --options $SHORT --longoptions $LONG --name "$0" -- "$@")
   (( $? != 0 )) && exit 1
   eval set -- "$PARSED"

   while true; do
      case "$1" in
         -h|--help)
            usage
            exit 0
            ;;
         -s|--server)
            setservers
            ;;
         --)
                echo "--"
            shift
            break
            ;;
         *)
            echo "Programming error"
            exit 3
            ;;
      esac
   done
   #ARGS=("$@")
   unset LONG SHORT PARSED

   # tests
   asset "$@"

   #run
   run "$@"
}

if [ "${BASH_SOURCE[0]}" == "$0" ]; then
   main "$@"
   exit 0
fi


usage :
sudo ./nginx-set.sh va installer/configurer nginx et php de la même façon que le post précédent.
sudo ./nginx-set.sh -s va ajouter un sous-domaine pré-installé/configuré, génial pour se pré-installer un service web de plus sans tout casser.
note: il ne modifie pas le fichier /etc/hosts

ps: aucune vérification de la validité du sous-domaine n'est faite, ne rentrez pas n'importe quoi !
Dernière modification par papajokeil y a 8 ans, modifié au total 1 fois.

installation configuration d'un serveur web [nginx]

#3Messageil y a 8 ans

nginx.install non identifier quand j'ai lancer le script meme en sudo.. je suis sous manjaro !

installation configuration d'un serveur web [nginx]

#4Messageil y a 8 ans

:rendre: corrigé

installation configuration d'un serveur web [nginx]

#5Messageil y a 8 ans

Impeccable, cela fonctionne merci bien !!! Tout est niquel ! Et surtout dire aux utilisateurs qu'il faut demarrer avecisystemctl enable php-fpm
systemctl enable nginx comme tu as tres bien dit ! Et qu'il faut rajouter apres son serveur :80 sinon il trouve pas ! Au moins sa sera encore plus complet qu'avant ! Tres bon post merci a toi !

installation configuration d'un serveur web [nginx]

#6Messageil y a 8 ans

theloverkill a écrit :IEt qu'il faut rajouter apres son serveur :80 sinon il trouve pas !

très très bizarre car c'est justement le port par défaut pour le serveur et le navigateur (80) si on ne stipule rien

et pour le démarrage, perso je suis plus en conteneur, mais en local j'ai mon petit script nginx, php, mysqld (compatible apache mais pas sur de l'avoir testé un jour...) car il n'est pas en enable pour moi :
http-server qui switch ON/OFF - OFF/ON

#!/usr/bin/env bash
#sans paramètre, il commute de on/off;

CR='\033[0m\033[31m'   #   red
CG='\033[0m\033[32m'   # green
CB="\033[1m"    # bold
CE='\033[0m'   # end

unset APACHE NGINX
NGINX=1

declare -A conf=(
   [server]='nginx'
   [journal]='nginx'
   [path]='/etc/nginx/sites-enabled'
   [reg]='server_name'
)

if [[ "$2" == "apache" ]]; then
   APACHE=1
   NGINX=0
   declare -A conf=(
      [server]='httpd'
      [journal]='apachectl'
      [path]='/etc/apache2/sites-enabled'
      [reg]='ServerName'
   )
fi

if [[ "$1" == "help" || "$1" == "-h" ]]; then
   systemctl status mysqld
   systemctl status ${conf[server]}
   echo -e "\n$0 start [apache]: démarrer"
   echo -e "$0 stop [apache]: stopper"
   echo -e "$0 log [apache]: voir les logs du jour"
   exit 0
fi

if [[ "$1" == "log" || "$1" == "logs" || "$1" == "journal" || "$1" == "-l" ]]; then
   echo "-- journalctl  -t ${conf[journal]} --no-pager"
   journalctl  -t ${conf[journal]} --since="today"
   exit 0
fi

unset START
[ "$1" == "start" ] && START=1

if [ -z "$1" ]; then
   echo -n "--Le serveur web va commuter. "
   etat=$(systemctl show  ${conf[server]} | awk -F= '/^ActiveState/ {print $2}')
   [ "$etat" == "active" ] && { unset START; CC=$CG; }|| { START=1; CC=$CR; }
   echo -e "le serveur est: $CC${etat}$CE"
fi

if ((START)); then
   echo "Démarrage de mon serveur http"

   sudo systemctl start mysqld
   sudo systemctl start php-fpm
   sudo systemctl start ${conf[server]}

   systemctl status ${conf[server]}
   echo -e "\n-------------"
   echo -e "Services disponibles (${conf[path]}):"
   
   for www in ${conf[path]}/*; do
      line=$(grep -v '#' $www | grep -E "^[[:blank:]].*${conf[reg]}")
      line=${line/${conf[reg]}/}
      line=${line//   /}
      [ -n "$line" ] &&   echo -e "$CG  ● ${CB}http://${line// /}$CE"
   done
   echo -e "$CE\npour fermer : $0 stop $2"
else
   echo "Eteindre mon serveur http"
   
   sudo systemctl stop mysqld
   sudo systemctl stop ${conf[server]}
   sudo systemctl stop php-fpm
   systemctl status ${conf[server]}
   echo -e "\npour démarrer : $0 start $2"
fi

installation configuration d'un serveur web [nginx]

#7Messageil y a 8 ans

Merci bien.
le script ne fonctionne pas chez moi. il me retourne une erreur de commande introuvable.
par contre en ligne de commande ça marche.
sauf que c'est la galère pour pouvoir manipuler mon projet avec un IDE. pas de permission sur le dossier /srv/http ou /var/http. j'ai du changer les permissions.
je n'ai pas créé de sites-available et sites-enables. j'ai mis tous mes projet dans des dossier séparés dans /srv/http et j'ai créé des liens symbolique dans var/http. si je pointe root directement vers /srv/http j'ai une erreur 403. si je pointe vers var/http ça marche.
j'y accède en localhost qui m'affiche l'arborescence des dossier.
par contre je ne suis pas arrivé à pointer un nom de serveur comme par exemple : http://www.monsite.local vers un de ces dossiers.
merci encore.
Répondre