Neste artigo, vamos mostrar como integrar o Crow com o servidor Apache, permitindo rodar aplicações C++ com suporte a HTTP, proxy reverso e configuração em produção.
Antes é necessário, lógico, possuir o Crow C++ instalado no seu sistema, para isso, instale as dependências:
Veja aqui: Como Instalar o Crow C++ no Windows, é mais interessante rodar sem ser no Apache usando diretamente com o servidor do Crow rodando o binário!
sudo apt install git build-essential cmake make libasio-dev g++
sudo pacman -S git base-devel cmake asio
Agora clone, compile e instale o Crow C++:
git clone https://github.com/CrowCpp/Crow
cd Crow
cmake . -B build -DCROW_BUILD_EXAMPLES=OFF -DCROW_BUILD_TESTS=OFF
sudo cmake --install build
Se quiser, já pode remover o repositório clonado:
cd .. && rm -rf CrowCpp
Certifique-se de possuir o Apache instalado e com as devidas permissões de escrita e leitura.
sudo apt install apache2
sudo chown -R $USER:$USER /var/www/html/
sudo pacman -S apache
sudo chown -R $USER:$USER /srv/http
# Ubuntu
mkdir -p /var/www/html/crow
cd /var/www/html/crow
# Arch
mkdir -p /srv/http/crow
cd /srv/http/crow
main.cpp
#include <crow.h> // No Windows use aspas duplas
int main(){
crow::SimpleApp app;
CROW_ROUTE(app, "/")([](){
return "Hello world";
});
app.port(18080).multithreaded().run();
}
Compile: g++ main.cpp -o app
e teste: ./app
e acesse no navegador: http://localhost:18080.
Use os caminhos e comandos similares no Arch.
systemd
:
sudo vim /etc/systemd/system/crow-app.service
, ou com seu editor preferido.
Cole isso dentro:
No Arch altere todos:
/var/www/html
para/srv/http
e em vez dewww-data
use somente:http
tanto paraUser
quanto paraGroup
[Unit]
Description=Crow C++ Web Application
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/html/crow
ExecStart=/var/www/html/crow/app
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Salve e saia.
sudo systemctl daemon-reload
sudo systemctl enable crow-app
sudo systemctl start crow-app
sudo systemctl status crow-app # para verificar se está rodando
Vai aparecer mais ou menos isso:
Ative os módulos necessários:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo vim /etc/httpd/conf/httpd.conf
e E descomente (ou adicione, se não estiver presente) as seguintes linhas:LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule rewrite_module modules/mod_rewrite.so
E também encontre (ou adicione) a seguinte linha:
Se tiver comentada(com
#
tralha na frente, remova), descomente.
Include conf/extra/httpd-vhosts.conf
sudo vim /etc/apache2/sites-available/000-default.conf
sudo vim /etc/httpd/conf/extra/httpd-vhosts.conf
Apague tudo que estiver dentro e cole isso:
No Arch altere a linha
/var/www/html
para/srv/http
e também troque:${APACHE_LOG_DIR}
por/var/log/httpd
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Proxy reverso simples que remove o prefixo
ProxyRequests Off
ProxyPreserveHost On
# Proxy para porta 18080
ProxyPass /crow/ http://127.0.0.1:18080/
ProxyPassReverse /crow/ http://127.0.0.1:18080/
# Reescrever URLs para remover o prefixo /crow/
RewriteEngine On
RewriteRule ^/crow/(.*)$ http://127.0.0.1:18080/$1 [P,L]
RewriteRule ^/crow/?$ http://127.0.0.1:18080/ [P,L]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Ative o modo rewrite, reinicie o Apache e teste acessando a URL:
No Arch basta reiniciar com esse comando:
sudo systemctl restart httpd
.
sudo pkill -f app # Opcional se não modificou o binário
sudo a2enmod rewrite
sudo systemctl restart apache2
xdg-open http://localhost/crow/
Pronto, agora é só desenvolver suas aplicações com Crow!
Lembrando que sempre que fizer alterações no binário, é necessário restartar o binário, usando pkill
:
sudo pkill -f app
No Arch prefira usar esses dois comandos abaixo:
sudo systemctl daemon-reexec # ou daemon-reload, se você não alterou o binário do systemd
sudo systemctl enable --now crow-app.service
Se quiser verificar o status:
sudo systemctl status crow-app.service
desenvolvimentoweb webdev cpp crow web apache