Natan Felles


Creative Webmaster


LEMP

Blog · desenvolvimento · projetos

LEMP

Linux + Engine X + MySQL + PHP

O Nginx foi se tornando popular como proxy cache e também por ser um servidor HTTP completo. Seu principal destaque é ser muito mais rápido e leve que o Apache. Neste artigo veremos como configurar um sistema de desenvolvimento com ele.

Atualização do Sistema

sudo apt update && sudo apt upgrade

Instalação do Nginx

Instalação da versão mais completa do Nginx:

sudo apt install nginx-extras

Instalação do MySQL

sudo apt install mysql-client mysql-server

Instalação do PHP

Instalação do PHP-FPM e módulos mais recomendados:

sudo apt install \
php-fpm \
php-pear \
php-auth \
php-imagick \
php-gettext \
php-gd \
php-mysql \
php-mbstring \
php-imap \
php-cgi \
php-intl \
php-pspell \
php-recode \
php-sqlite3 \
php-tidy \
php-xmlrpc \
php-xsl \
php-zip \
php-curl \
php-mcrypt \
php-geoip \
php-apcu \
php-memcached \
php7.0-opcache \
php-codesniffer

Pacotes Extras

Há alguns pacotes você irá precisar no decorrer do tempo:

sudo apt install \
curl \
mcrypt \
geoip-database-contrib \
composer \
npm \
git \
sqlite3 \
memcached \
imagemagick

Extra

Quando estou desenvolvendo, prefiro utilizar um servidor local, na mesma máquina. Porém, nem sempre ligo o computador apenas para trabalhar. Então acho mais eficaz deixar o LEMP desabilitado na inicialização, para manter o boot mais rápido e ocupar menos recursos do sistema.

Para isso, podemos desabilitar o Nginx, o MySQL e o PHP-FPM:

sudo systemctl disable nginx.service
sudo systemctl disable mysql.service
sudo systemctl disable php7.0-fpm.service
sudo systemctl disable memcached.service

Também criei um arquivo para automatizar o gerenciamento do lemp. Ele é bem simples e serve apenas para mostrar informações sobre versões dos softwares, iniciar, reiniciar, parar e adicionar novos virtual hosts:

/usr/local/bin/lemp
#!/bin/bash
# Author: Natan Felles <natanfelles@gmail.com>
# Description: Easy LEMP Management
# Local: /usr/local/bin/lemp

# Default color
COLOR0=$(tput sgr0)
# Red
COLOR1=$(tput setaf 1)
# Green
COLOR2=$(tput setaf 2)
# Yellow
COLOR3=$(tput setaf 3)
# Blue
COLOR4=$(tput setaf 4)

# Check if is super-user
if [ $(id -u) != '0' ]; then
    echo "${COLOR1}You must be root to run this script.${COLOR0}";
    exit 1;
fi

# Get Website owner username
user_func(){
    echo -n "${COLOR2}Website owner username:${COLOR0} "
    read USER
    # Root path where domain folders wil be created
    #ROOT=/var/www/${USER}
    # Custom root path
    ROOT=/home/${USER}/Websites/
}

# Start Services
start_func(){
    /etc/init.d/nginx start;
    /etc/init.d/php7.0-fpm start;
    /etc/init.d/mysql start;
    /etc/init.d/memcached start;
}

# Stop Services
stop_func(){
    /etc/init.d/nginx stop;
    /etc/init.d/php7.0-fpm stop;
    /etc/init.d/mysql stop;
    /etc/init.d/memcached stop;
}

# Restart Services
restart_func(){
    /etc/init.d/nginx restart;
    /etc/init.d/php7.0-fpm restart;
    /etc/init.d/mysql restart;
    /etc/init.d/memcached restart;
}

# Add Virtual Host
add_func(){
    user_func
    echo -n "${COLOR2}Domain to Add:${COLOR0} "
    read DOMAIN
    FILE="/etc/nginx/sites-available/${DOMAIN}.conf"
    if [ -f "${FILE}" ]; then
        echo "${COLOR1}This domain already exists.${COLOR0}"
        exit
    else
        BASE=${ROOT}${DOMAIN}/
        mkdir -p ${BASE}
        PUBLIC=${BASE}public/
        mkdir -p ${PUBLIC}
        INDEX="${PUBLIC}index.php"
        touch ${INDEX}
        echo "<?= \"${DOMAIN} is live!\";" > ${INDEX}
        chown -R ${USER}:${USER} ${BASE}
        CONFIG="
server {

    ## Default port
    listen 80;

    ## SSL configuration
    listen 443 ssl;
    include snippets/snakeoil.conf;

    ## Show folders contents
    autoindex on;

    ## Public filesystem Path
    root ${PUBLIC};

    ## Index files
    index index.php index.html;

    ## Domains
    server_name ${DOMAIN} www.${DOMAIN};

    ## Enable URL Rewrite in Web Root
    location / {
        try_files \$uri \$uri/ /index.php?\$args;
    }

    ## Pass the PHP scripts to PHP-FPM Socket
    location ~ \\.php\$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    ## Deny access to hidden files
    location ~ /\\. {
        deny all;
    }

    ## Permit files to be accessed from other domains
    # add_header Access-Control-Allow-Origin \"*\"; # Can be a domain

    ## Cache
    # location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ {
    #	add_header Cache-Control \"public\";
    #	add_header X-Frame-Options \"SAMEORIGIN\";
    #	expires +1y;
    # }

    ## Serve static files directly
    # location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
    #	access_log off;
    # }

    ## Force SSL
    # if (\$scheme != \"https\") {
    #	rewrite ^ https://${DOMAIN}\$request_uri? permanent;
    # }

    # Force www
    # if (\$http_host != \"www.${DOMAIN}\") {
    #     rewrite ^ \$scheme://www.${DOMAIN}\$request_uri? permanent;
    # }

    ## Disable log and allow robots
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

}
"
        touch ${FILE}
        echo "${CONFIG}" > ${FILE}
        ln -s ${FILE} /etc/nginx/sites-enabled/${DOMAIN}.conf
        /etc/init.d/nginx restart >> /dev/null
        echo ""
        echo "${COLOR4}Info:${COLOR0}"
        echo "Add the following line in /etc/hosts:"
        echo "${COLOR3}127.0.0.1 ${DOMAIN} www.${DOMAIN}${COLOR0}"
        echo "After you can access your site in http://${DOMAIN}"
        echo "The local path is ${BASE}"
    fi
}

delete_func(){
    echo -n "${COLOR2}Domain to Delete:${COLOR0} "
    read DOMAIN
    rm "/etc/nginx/sites-available/${DOMAIN}.conf"
    rm "/etc/nginx/sites-enabled/${DOMAIN}.conf"
    /etc/init.d/nginx restart >> /dev/null
    echo ""
    echo "${COLOR4}Info:${COLOR0}"
    echo "Your web files was not removed. Just the vhost config."
    echo "Delete the following line in /etc/hosts:"
    echo "${COLOR3}127.0.0.1 ${DOMAIN} www.${DOMAIN}${COLOR0}"
}


info_func(){
    echo -n "${COLOR2}Linux: ${COLOR0}"
    uname -a
    echo -n "${COLOR2}Nginx: ${COLOR0}"
    nginx -v
    echo -n "${COLOR2}MySQL: ${COLOR0}"
    mysql -V
    echo -n "${COLOR2}PHP: ${COLOR0}"
    php -v
}

case "$1" in
    start )
        start_func
        ;;
    stop )
        stop_func
        ;;
    restart )
        restart_func
        ;;
    add )
        add_func
        ;;
    delete )
        delete_func
        ;;
    info )
        info_func
        ;;
    * )
        echo "Options: {start|stop|restart|add|delete|info}";
esac

Você pode executar esse arquivo de qualquer local ou, preferencialmente, salve-o em /usr/local/bin/lemp então poderá usá-lo com a seguinte sintaxe:

lemp start

Digite apenas lemp para ver os possíveis parâmetros.

Primeiro Virtual Host

Para criar seu primeiro site local, execute o seguinte comando:

lemp add

O script será executado e irá lhe pedir um domínio: Domain to Add:

Adicione o domínio que quiser, por exemplo: domain.tld ou meusite.local. Pressione enter e depois aponte o domínio para 127.0.0.1 conforme lhe será instruído no decorrer do script. Depois, reinicie o lemp com lemp restart.

Será criada uma pasta em /var/www e os arquivos de configuração /etc/nginx/sites-*.

É isso. Caso não tenha entendido alguma coisa; entre em contato ou pesquise. Acredito que esse artigo poderá lhe facilitar para desenvolver para web daqui para a frente.


Nota

Desde que criei esse script vinha tendo problemas ao atualizar o MySQL via apt. O gerenciador não conseguia fazer upgrade do pacote para uma nova versão e o mantinha na mesma.

Caso isso aconteça com você, a solução é bem simples: basta habilitar o MySQL pelo systemctl:

sudo systemctl enable mysql.service

Depois, faça o upgrade do pacote e desabilite a inicialização automática do banco de dados, se quiser.

sudo apt update
sudo apt upgrade
sudo apt -f install
sudo systemctl disable mysql.service