Como configurar o nginx + php (fcgi) para executar todos os subdomínios com um usuário diferente?

4

Sou muito novo no nginx e - mais para fins de aprendizado - estou tentando configurar o Nginx para executar o php com um usuário diferente para cada subdomínio.

Por exemplo, eu gostaria de usar o usuário john para todos os scripts em foo.example.com e usuário jack para bar.example.com .

Eu já criei o usuário no meu sistema (servidor ubuntu), mas eu não sei como instruir o nginx a usar os usuários - e estou procurando por uma solução que possa lidar com muitos usuários, digamos ~ 2000.

Olhando a documentação, eu não entendo se eu tenho que gerar um processo de php5-cgi para cada usuário (com uma porta diferente) e, em seguida, pegue-os em meus sites-available sites (como eu disse im um novato, mas isso parece para mim como um suicídio do servidor), e as únicas duas páginas na configuração do nginx que falam sobre isso ... estão escritas em chinês ( page1 , page2 ), difícil de traduzir com o google translate (mas, olhando os códigos, usa um totalmente diferente do server-suicide maneira)

Alguma sugestão?

Atualizar

A resposta de galador faz o trabalho, mas eu estou tentando construir um ambiente dinamycal (com subdomínios wildcards) que não precisa de gravar nginx / fpm para cada novo site, isso é possível?

    
por Strae 29.03.2011 / 17:29

1 resposta

6

Editar : Acabei de perceber que o requisito "precisa ser dimensionado para ~ 2000 usuários" ... talvez essa não seja sua melhor opção, mas provavelmente poderia ser facilmente automatizada com um pouco de script.

Você pode usar o php-fpm para fazer algo parecido com isto (o fpm é parte do PHP desde PHP 5.3.3 . Eu hospedo alguns sites no meu VPS, e uso algo similar.

Meu php-fpm.conf principal se parece com:

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
include=/usr/local/etc/fpm.d/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Default Value: none
pid = /var/run/php-fpm.pid

; Error log file
; Default Value: /var/log/php-fpm.log
error_log = /var/log/php-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when 
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
;daemonize = yes

E, na pasta fpm.d, tenho arquivos de configuração para cada site assim:

[myuser]
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
user = myuser
group = myuser

pm = dynamic
pm.max_children = 15
pm.start_servers = 3
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 2000

request_slowlog_timeout = 5
slowlog = /home/myuser/tmp/logs/myuser.slow.log

php_admin_value[error_log] = /home/myuser/tmp/logs/myuser.error.log
php_admin_flag[log_errors] = on

Em seguida, para cada site, você altera o usuário e a porta em seu próprio arquivo e, na configuração nginx, você terá algo como:

location ~ .*.php$ {
    include /usr/local/etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Alterando a porta na diretiva fastcgi_pass.

    
por 29.03.2011 / 18:41