Postez ici vos trucs & astuces.
#1Messageil y a 8 ansInstallation 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
--------------------------
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 :
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
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,...) Manjaro STABLE - Linux lts - fish - Kde5 - icore N100 - 16Go RAM - ssd - efi
#mount /dev/archlinux /mnt/manjaro
#2Messageil y a 8 anspressé, 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
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 ! Manjaro STABLE - Linux lts - fish - Kde5 - icore N100 - 16Go RAM - ssd - efi
#mount /dev/archlinux /mnt/manjaro
Dernière modification par
papajokeil y a 8 ans, modifié au total 1 fois.
#3Messageil y a 8 ansnginx.install non identifier quand j'ai lancer le script meme en sudo.. je suis sous manjaro ! #4Messageil y a 8 ans corrigé Manjaro STABLE - Linux lts - fish - Kde5 - icore N100 - 16Go RAM - ssd - efi
#mount /dev/archlinux /mnt/manjaro
#5Messageil y a 8 ansImpeccable, 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 ! #6Messageil y a 8 anstheloverkill 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
Manjaro STABLE - Linux lts - fish - Kde5 - icore N100 - 16Go RAM - ssd - efi
#mount /dev/archlinux /mnt/manjaro
#7Messageil y a 8 ansMerci 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. 4x Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz - 4 go de RAM
Linux 4.4.5-1-MANJARO (x86_64)