Como fazer o Nginx ler as variáveis de ambiente do Linux?
Tenho um servidor Nginx rodando junto com o PHP, porém não consigo fazer com que as aplicações que precisam acessar o banco de dados Oracle se conectem ao banco, pois preciso acessar as variáveis de ambiente do Linux chamadas ORACLE_HOME e LD_LIBRARY_PATH.
Já quando utilizo o Apache, consigo ler e executar as aplicações perfeitamente, porém quando uso Nginx, não consigo.
Ao executar o comando env no Linux, após exportar as variáveis da biblioteca do Oracle, tenho listado na tela os caminhos abaixo.
LD_LIBRARY_PATH=/usr/local/instantclient_11_2/
ORACLE_HOME=/usr/local/instantclient_11_2/network/admin/
Alguém pode ajudar:hahaha:?
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Amigo voce quer usar o ORACLE com php certo ?
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Então no meu entender as suas variaveis de ambiente devem ser carregadas com seu php-fpm
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Olá amigo, muito obrigado pela resposta.
Sim, eu preciso usar o Oracle com PHP no Nginx especificamente.
Quanto a setar as variáveis no php-fpm.conf, eu já fiz isso e não funcionou. Retirei do arquivo de configuração do php-fpm a seção onde é indicado o local para configurar estas variáveis de ambiente para mostrar-lhe. Será que coloquei alguma sintaxe errada? Veja abaixo o trecho original do arquivo.
Código :
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
Se você observar, ele inclusive usa como exemplo a variável LD_LIBRARY_PATH, que é justamente a que preciso fazer com que o Nginx ao executar o código em PHP referenciando a base de dados Oracle reconheça, porém eu já tentei usar as seguintes sintaxes abaixo neste arquivo e não funcionou(vale lembrar que descomentei as linhas antes de inserir os códigos).
1º Tentativa - Tentei desta forma para ver se ele pegava as variáveis de ambiente do LInux e replicava no Nginx com o mesmo nome, mas não funcionou e fiz justamente como interpretei o exemplo.
Código :
env[LD_LIBRARY_PATH] = $LD_LIBRARY_PATH
env[ORACLE_HOME] = $ORACLE_HOME
2º Tentativa - Tentei setar o nome das variáveis assim como fiz no Linux quando dei o comando export, mas também não funcionou.
Código :
env[LD_LIBRARY_PATH] = /usr/local/instantclient_11_2/
env[ORACLE_HOME] = /usr/local/instantclient_11_2/network/admin/
3º Tentativa - Tentei não setar as variáveis no Linux e só deixar no php-fpm.conf do mesmo jeito que fiz acima e também não funcionou.
Código :
LD_LIBRARY_PATH=/usr/local/instantclient_11_2/
ORACLE_HOME=/usr/local/instantclient_11_2/network/admin/
Alguém sabe de mais alguma coisa?
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Que distribuicao voce esta usando ?
Voce ja tentou colocar essas variaveis no script de inicializacao do php-fpm ?
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Olá amigo, mais uma vez multíssimo obrigado pela resposta.
Eu uso Debian 6 Squeeze e tanto na versão 32 ou 64bit a mesma situação ocorre.
Mas vamos lá, você saberia me dizer onde abaixo eu devo colocar estas variáveis?
Código :
#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-fpm
# Description: starts the PHP FastCGI Process Manager daemon
### END INIT INFO
prefix=/opt/php5
exec_prefix=${prefix}
php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF"
wait_for_pid () {
try=0
while test $try -lt 35 ; do
case "$1" in
'created')
if [ -f "$2" ] ; then
try=''
break
fi
;;
'removed')
if [ ! -f "$2" ] ; then
try=''
break
fi
;;
esac
echo -n .
try=`expr $try + 1`
sleep 1
done
}
case "$1" in
start)
echo -n "Starting php-fpm "
$php_fpm_BIN $php_opts
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
fi
wait_for_pid created $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
stop)
echo -n "Gracefully shutting down php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -QUIT `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed. Use force-quit"
exit 1
else
echo " done"
fi
;;
force-quit)
echo -n "Terminating php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -TERM `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
restart)
$0 stop
$0 start
;;
reload)
echo -n "Reload service php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -USR2 `cat $php_fpm_PID`
echo " done"
;;
*)
echo "Usage: $0 {start|stop|force-quit|restart|reload}"
exit 1
;;
esac
:stoned:
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
darkbr,
tente colocar ar variaveis
Código :
LD_LIBRARY_PATH=/usr/local/instantclient_11_2/
ORACLE_HOME=/usr/local/instantclient_11_2/network/admin/
Logo abaixo de
no seu init do php-fpm
faca um teste e me informe.
Obrigado,
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Caríssimo, muito obrigado pela resposta mais uma vez, porém não funcionou.
Fiz exatamente do jeito que você escreveu.
Código :
#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-fpm
# Description: starts the PHP FastCGI Process Manager daemon
### END INIT INFO
LD_LIBRARY_PATH=/usr/local/instantclient_11_2/
ORACLE_HOME=/usr/local/instantclient_11_2/network/admin/
prefix=/opt/php5
exec_prefix=${prefix}
php_fpm_BIN=${exec_prefix}/sbin/php-fpm
php_fpm_CONF=${prefix}/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF"
wait_for_pid () {
try=0
while test $try -lt 35 ; do
case "$1" in
'created')
if [ -f "$2" ] ; then
try=''
break
fi
;;
'removed')
if [ ! -f "$2" ] ; then
try=''
break
fi
;;
esac
echo -n .
try=`expr $try + 1`
sleep 1
done
}
case "$1" in
start)
echo -n "Starting php-fpm "
$php_fpm_BIN $php_opts
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
fi
wait_for_pid created $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
stop)
echo -n "Gracefully shutting down php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -QUIT `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed. Use force-quit"
exit 1
else
echo " done"
fi
;;
force-quit)
echo -n "Terminating php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -TERM `cat $php_fpm_PID`
wait_for_pid removed $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;
restart)
$0 stop
$0 start
;;
reload)
echo -n "Reload service php-fpm "
if [ ! -r $php_fpm_PID ] ; then
echo "warning, no pid file found - php-fpm is not running ?"
exit 1
fi
kill -USR2 `cat $php_fpm_PID`
echo " done"
;;
*)
echo "Usage: $0 {start|stop|force-quit|restart|reload}"
exit 1
;;
esac
Eu estava esperançaso para chegar hoje no serviço e finalmente este negócio funcionar. Eu não consigo entender qual o conceito que o Nginx utiliza para ler estas variáveis.
Bem, se alguém tiver mais alguma alternativa, eu estarei aqui. :2in1:
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
darkbr,
Voce poderia colar os erros que vc esta tendo aqui para que eu possa entender se os mesmos tem relacao com as variaveis de ambiente ou outra coisa ?
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Claro!
Este abaixo é o meu código em PHP
Código PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
$db = '(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.3)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = banco)))';
$username = 'userbanco';
$password = 'senhabanco;
$dbname = 'banco_producao'; // O Nome da base aqui
$conexao = oci_connect($username, $password, $dbname);
$s = oci_parse($conexao, 'select * from tbl_usuario');
oci_execute($s);
while ($row = oci_fetch_array($s, OCI_NUM)) {
echo $row[0] . "<br>";
echo $row[1] . "<br>";
}
?>
Este abaixo é erro que me é retornado na tela
Warning: oci_connect(): Error while trying to retrieve text for error ORA-12154 in /srv/www/oci8.php on line 13 Warning: oci_parse() expects parameter 1 to be resource, boolean given in /srv/www/oci8.php on line 15 Warning: oci_execute() expects parameter 1 to be resource, null given in /srv/www/oci8.php on line 17 Warning: oci_fetch_array() expects parameter 1 to be resource, null given in /srv/www/oci8.php on line 19
Como você pode ver a função oci_connect() não pode ser executada, retornando o erro ORA-12154 que significa que não foi possível encontrar a variável de ambiente ORACLE_HOME no Linux.
Como eu havia dito no primeiro tópico, no Apache não tenho este problema, eu compilo o PHP usando a biblioteca oci8 em 32 ou 64bit e imediatamente me conecto no banco. Tanto que se eu executar o código acima em um servidor Apache, ele me traz o resultado com os usuários cadastrados na tabela de usuário e o erro mostrado logo acima, não acontece.
Referências:
No link abaixo você consegue baixar o livro The Underground PHP and Oracle Manual que trata de conexões Oracle com PHP.
The Underground PHP and Oracle Manual | Homepage
Na página 106 há um descritivo sobre este erro falando justamente para setar corretamente a variável de ORACLE_HOME caso o erro aconteça, só que ela já está setada corretamente no Linux, tanto que posso efetuar o comando cd $ORACLE_HOME e cair exatamente na pasta /usr/local/instantclient_11_2/network/admin/.
O livro acima só trata de conexões PHP com Apache e nada de Nginx.
Este código abaixo é de meu arquivo nginx.conf, vou deixá-lo por aqui caso preste para alguma coisa.
Código :
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root html;
# index index.html index.htm;
#}
location / {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Se alguém souber mais alguma alternativa.:bawling:
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Vamos tentar uma coisa diferente
mude a inicializacao do seu php-fpm para o codigo abaixo
Código :
#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fpm
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php-fpm
# Description: starts the PHP FastCGI Process Manager daemon
### END INIT INFO
LD_LIBRARY_PATH=/usr/local/instantclient_11_2:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
ORACLE_HOME=/usr/local/instantclient_11_2
export ORACLE_HOME
LD_PRELOAD=/usr/local/instantclient_11_2/libclntsh.so.11.1
export LD_PRELOAD
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Caro amigo,
muito, muito obrigado pela atenção. Eu fui orientado a montar um servidor Nginx a pedido de uma empresa vencedora de uma licitação, que argumentou que o Apache não "aguentaria" o nível de acesso que o novo portal a ser construído teria. Pois bem, trabalho com Apache já alguns anos e nunca vi Apache cair desta forma(Só o site da Cespe quando a galera precisa conferir o local de prova:fisheye:), mas o que precisava mesmo era colocar este troço para funcionar.
Gostei muito do Nginx e estou aprendendo a domá-lo, claro que seria bem mais fácil se grande parte de suas listas de discussões não fossem em Japonês, Turco e Russo, mas isso é só um detalhe.
Antes de postar no fórum eu já havia desistido de tentar novamente fazer minha aplicação em php rodar no Nginx acessando a porcaria do Oracle, porém resolvi postar minha dúvida em 3 fóruns que gosto muito, o Viva o Linux, Debian Fórum e aqui no Under-Linux. Pois bem, você foi o único que conseguiu me ajudar um pouco e quando começou a me responder, me motivou a voltar a procurar sobre isso.
Enfim, li no stackoverflow(ruby on rails - How do I pass ImageMagick environment variables to nginx mongrels? - Stack Overflow) uma resposta de um post, dizendo que o Nginx não lida com variáveis de ambiente e não foi feito para isso, principalmente por causa de seu design, segurança e administração. Citou também que o modo passenger utilizado para o Ruby(utilizado para passar variáveis de ambiente) é um módulo feito por terceiros e que não respeita os padrões do Nginx e no final, ele argumenta que existem várias formas de resolver este problema sem que o Nginx tenha de lidar com isso.
Percebi que era mesmo necessário eu utilizar somente o php-fpm para passar as variáveis, como você que já estava seguindo esta linha de raciocínio.
Sinceramente eu já tinha testado algumas coisas do que você escreveu, somente o start do php-fpm é que eu não havia tentado ainda. Então, navegando no Google, li este post Environment variables and php settings through fastcgi_param no fórum do Nginx com uma observação maior do que a de costume e percebi que o camarada passava as variáveis de ambiente via fastcgi para o Nginx do jeito que eu já fazia, só que com uma pequena observação, o v**** usava "aspas duplas" no caminho do diretório.
Pois bem, chega de embromação, segue abaixo a solução.
Este abaixo é meu arquivo nginx.conf
Código :
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root html;
# index index.html index.htm;
#}
location / {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_param ORACLE_HOME "/usr/local/instantclient_11_2/network/admin"; <--Aqui está a mágica
fastcgi_param LD_LIBRARY_PATH "/usr/local/instantclient_11_2"; <--Aqui está a mágica
fastcgi_param SCRIPT_FILENAME /srv/www$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Funfou de primeira!
VAleu!:fight:
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
Mas eu vou tentar depois o que você fez por último também, mas por hora tá resolvido.
Como eu coloco um RESOLVIDO lá na entrada do meu tópico?
Valeu mais uma vez.
Re: Como fazer o Nginx ler as variáveis de ambiente do Linux?
darkbr,
Que bom que conseguiu resolver o nginx é um otimo servidor web e nós usamos ele aqui no portal under-linux.org
Conforme pedido irei fechar o tópico já que você conseguiu resolver e postou a solução.
Obrigado pela contribuição,