我已经使用Ubuntu Server 12.04 LTS和LEMP堆栈设置了本地测试VM.这是一种非传统的设置,因为我没有在本地机器上安装所有
PHP脚本,而是将NTFS共享作为文档根安装,因为我在Windows上进行了开发.直到今天早上我才能完美地完成所有工作,现在我不断发现一个可怕的“文件未找到”.错误.
原文链接:https://www.f2er.com/ubuntu/348242.html我几乎肯定这必须以某种方式与权限相关,因为如果我将我的网站复制到/ var / www,Nginx和PHP-fpm在提供我的PHP脚本时没有问题.我无法弄清楚的是为什么突然(重启服务器之后),不会提供PHP文件而只是“找不到文件”.错误.静态文件工作正常,所以我认为这是导致头疼的PHP.
Nginx和PHP-fpm都配置为以用户www-data运行:
root@ubuntu-server:~# ps aux | grep 'Nginx\|PHP-fpm' root 1095 0.0 0.0 5816 792 ? Ss 11:11 0:00 Nginx: master process /opt/Nginx/sbin/Nginx -c /etc/Nginx/Nginx.conf www-data 1096 0.0 0.1 6016 1172 ? S 11:11 0:00 Nginx: worker process www-data 1098 0.0 0.1 6016 1172 ? S 11:11 0:00 Nginx: worker process root 1130 0.0 0.4 175560 4212 ? Ss 11:11 0:00 PHP-fpm: master process (/etc/PHP5/PHP-fpm.conf) www-data 1131 0.0 0.3 175560 3216 ? S 11:11 0:00 PHP-fpm: pool www www-data 1132 0.0 0.3 175560 3216 ? S 11:11 0:00 PHP-fpm: pool www www-data 1133 0.0 0.3 175560 3216 ? S 11:11 0:00 PHP-fpm: pool www root 1686 0.0 0.0 4368 816 pts/1 S+ 11:11 0:00 grep --color=auto Nginx\|PHP-fpm
我已经通过编辑/ etc / fstab并添加以下行将NTFS共享挂载到/ mnt / webfiles:
//192.168.0.199/c$/Websites/ /mnt/webfiles cifs username=Jordan,password=mypasswordhere,gid=33,uid=33 0 0
其中gid 33是www数据组,uid 33是用户www-data.如果我列出我的某个网站的内容,您实际上可以看到它们属于用户www-data:
root@ubuntu-server:~# ls -l /mnt/webfiles/nTv5-2.0 total 8 drwxr-xr-x 0 www-data www-data 0 Jun 6 19:12 app drwxr-xr-x 0 www-data www-data 0 Aug 22 19:00 assets -rwxr-xr-x 0 www-data www-data 1150 Jan 4 2012 favicon.ico -rwxr-xr-x 0 www-data www-data 1412 Dec 28 2011 index.PHP drwxr-xr-x 0 www-data www-data 0 Jun 3 16:44 lib drwxr-xr-x 0 www-data www-data 0 Jan 3 2012 plugins drwxr-xr-x 0 www-data www-data 0 Jun 3 16:45 vendors
如果我切换到www-data用户,我在共享上创建新文件没有问题:
root@ubuntu-server:~# su www-data $> /mnt/webfiles/test.txt $ls -l /mnt/webfiles | grep test\.txt -rwxr-xr-x 0 www-data www-data 0 Sep 8 11:19 test.txt
使用以用户www-data运行的PHP-fpm读取或写入共享应该没有问题.
2012/09/08 11:22:36 [error] 1096#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream,client: 192.168.0.199,server:,request: "GET / HTTP/1.1",upstream: "fastcgi://unix:/var/run/PHP5-fpm.sock:",host: "192.168.0.123" 2012/09/08 11:22:39 [error] 1096#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream,request: "GET /apc.PHP HTTP/1.1",host: "192.168.0.123"
奇怪的是,这在以前工作,现在所有突然的PHP都在抱怨它无法“找到”共享上的脚本.有人知道为什么会这样吗?
编辑
我尝试编辑PHP-fpm.conf并将chdir更改为以下内容:
chdir = /mnt/webfiles
Starting PHP-fpm [08-Sep-2012 14:20:55] ERROR: [pool www] the chdir path '/mnt/webfiles' does not exist or is not a directory
这是废话的总负载,因为这个目录存在并且已经挂载!列出该目录的任何ls命令都能正常工作.为什么地狱不能PHP-FPM看到这个目录?!
以下是我的配置文件供参考:
Nginx.conf
user www-data; worker_processes 2; error_log /var/log/Nginx/Nginx.log info; pid /var/run/Nginx.pid; events { worker_connections 1024; multi_accept on; } http { include fastcgi.conf; include mime.types; default_type application/octet-stream; set_real_ip_from 127.0.0.1; real_ip_header X-Forwarded-For; ## Proxy proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 32m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffers 32 4k; ## Compression gzip on; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+RSS text/javascript; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; ### TCP options tcp_nodelay on; tcp_nopush on; keepalive_timeout 65; sendfile on; include /etc/Nginx/sites-enabled/*; }
我的网站配置
server { listen 80; access_log /var/log/Nginx/$host.access.log; error_log /var/log/Nginx/error.log; root /mnt/webfiles/nTv5-2.0/app/webroot; index index.PHP; ## Block bad bots if ($http_user_agent ~* (HTTrack|HTMLParser|libcurl|discobot|Exabot|Casper|kmccrew|plaNETWORK|RPT-HTTPClient)) { return 444; } ## Block certain Referers (case insensitive) if ($http_referer ~* (sex|vigra|viagra) ) { return 444; } ## Deny dot files: location ~ /\. { deny all; } ## Favicon Not Found location = /favicon.ico { access_log off; log_not_found off; } ## Robots.txt Not Found location = /robots.txt { access_log off; log_not_found off; } if (-f $document_root/maintenance.html) { rewrite ^(.*)$/maintenance.html last; } location ~* \.(?:ico|css|js|gif|jpe?g|png)${ # Some basic cache-control for static files to be sent to the browser expires max; add_header Pragma public; add_header Cache-Control "max-age=2678400,public,must-revalidate"; } location / { try_files $uri $uri/ index.PHP; if (-f $request_filename) { break; } rewrite ^(.+)$/index.PHP?url=$1 last; } location ~ \.PHP${ include /etc/Nginx/fastcgi.conf; fastcgi_pass unix:/var/run/PHP5-fpm.sock; } }
PHP-fpm.conf
;;;;;;;;;;;;;;;;;;;;; ; FPM Configuration ; ;;;;;;;;;;;;;;;;;;;;; ; All relative paths in this configuration file are relative to PHP's install ; prefix (/opt/PHP5). This prefix can be dynamicaly changed by using the ; '-p' argument from the command line. ; Include one or more files. If glob(3) exists,it is used to include a bunch of ; files from a glob(3) pattern. This directive can be used everywhere in the ; file. ; Relative path can also be used. They will be prefixed by: ; - the global prefix if it's been set (-p arguement) ; - /opt/PHP5 otherwise ;include=etc/fpm.d/*.conf ;;;;;;;;;;;;;;;;;; ; Global Options ; ;;;;;;;;;;;;;;;;;; [global] ; Pid file ; Note: the default prefix is /opt/PHP5/var ; Default Value: none pid = /var/run/PHP-fpm.pid ; Error log file ; Note: the default prefix is /opt/PHP5/var ; Default Value: log/PHP-fpm.log error_log = /var/log/PHP5-fpm/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),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 ;;;;;;;;;;;;;;;;;;;; ; Pool Definitions ; ;;;;;;;;;;;;;;;;;;;; ; Multiple pools of child processes may be started with different listening ; ports and different management options. The name of the pool will be ; used in logs and stats. There is no limitation on the number of pools which ; FPM can handle. Your system will tell you anyway :) ; Start a new pool named 'www'. ; the variable $pool can we used in any directive and will be replaced by the ; pool name ('www' here) [www] ; Per pool prefix ; It only applies on the following directives: ; - 'slowlog' ; - 'listen' (unixsocket) ; - 'chroot' ; - 'chdir' ; - 'PHP_values' ; - 'PHP_admin_values' ; When not set,the global prefix (or /opt/PHP5) applies instead. ; Note: This directive can also be relative to the global prefix. ; Default Value: none ;prefix = /path/to/pools/$pool ; The address on which to accept FastCGI requests. ; Valid Syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses on a ; specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. ;listen = 127.0.0.1:9000 listen = /var/run/PHP5-fpm.sock ; Set listen(2) backlog. A value of '-1' means unlimited. ; Default Value: 128 (-1 on FreeBSD and OpenBSD) ;listen.backlog = -1 ; List of ipv4 addresses of FastCGI clients which are allowed to connect. ; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original ; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address ; must be separated by a comma. If this value is left blank,connections will be ; accepted from any ip address. ; Default Value: any ;listen.allowed_clients = 127.0.0.1 ; Set permissions for unix socket,if one is used. In Linux,read/write ; permissions must be set in order to allow connections from a web server. Many ; BSD-derived systems allow connections regardless of permissions. ; Default Values: user and group are set as the running user ; mode is set to 0666 ;listen.owner = www-data ;listen.group = www-data ;listen.mode = 0666 ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set,the default user's group ; will be used. user = www-data group = www-data ; Choose how the process manager will control the number of child processes. ; Possible Values: ; static - a fixed number (pm.max_children) of child processes; ; dynamic - the number of child processes are set dynamically based on the ; following directives: ; pm.max_children - the maximum number of children that can ; be alive at the same time. ; pm.start_servers - the number of children created on startup. ; pm.min_spare_servers - the minimum number of children in 'idle' ; state (waiting to process). If the number ; of 'idle' processes is less than this ; number then some children will be created. ; pm.max_spare_servers - the maximum number of children in 'idle' ; state (waiting to process). If the number ; of 'idle' processes is greater than this ; number then some children will be killed. ; Note: This value is mandatory. pm = dynamic ; The number of child processes to be created when pm is set to 'static' and the ; maximum number of child processes to be created when pm is set to 'dynamic'. ; This value sets the limit on the number of simultaneous requests that will be ; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. ; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP ; CGI. ; Note: Used when pm is set to either 'static' or 'dynamic' ; Note: This value is mandatory. pm.max_children = 50 ; The number of child processes created on startup. ; Note: Used only when pm is set to 'dynamic' ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 pm.start_servers = 20 ; The desired minimum number of idle server processes. ; Note: Used only when pm is set to 'dynamic' ; Note: Mandatory when pm is set to 'dynamic' pm.min_spare_servers = 5 ; The desired maximum number of idle server processes. ; Note: Used only when pm is set to 'dynamic' ; Note: Mandatory when pm is set to 'dynamic' pm.max_spare_servers = 35 ; The number of requests each child process should execute before respawning. ; This can be useful to work around memory leaks in 3rd party libraries. For ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. ; Default Value: 0 pm.max_requests = 500 ; The URI to view the FPM status page. If this value is not set,no URI will be ; recognized as a status page. By default,the status page shows the following ; information: ; accepted conn - the number of request accepted by the pool; ; pool - the name of the pool; ; process manager - static or dynamic; ; idle processes - the number of idle processes; ; active processes - the number of active processes; ; total processes - the number of idle + active processes. ; max children reached - number of times,the process limit has been reached,; when pm tries to start more children (works only for ; pm 'dynamic') ; The values of 'idle processes','active processes' and 'total processes' are ; updated each second. The value of 'accepted conn' is updated in real time. ; Example output: ; accepted conn: 12073 ; pool: www ; process manager: static ; idle processes: 35 ; active processes: 65 ; total processes: 100 ; max children reached: 1 ; By default the status page output is formatted as text/plain. Passing either ; 'html' or 'json' as a query string will return the corresponding output ; Syntax. Example: ; http://www.foo.bar/status ; http://www.foo.bar/status?json ; http://www.foo.bar/status?html ; Note: The value must start with a leading slash (/). The value can be ; anything,but it may not be a good idea to use the .PHP extension or it ; may conflict with a real PHP file. ; Default Value: not set pm.status_path = /status ; The ping URI to call the monitoring page of FPM. If this value is not set,no ; URI will be recognized as a ping page. This could be used to test from outside ; that FPM is alive and responding,or to ; - create a graph of FPM availability (rrd or such); ; - remove a server from a group if it is not responding (load balancing); ; - trigger alerts for the operating team (24/7). ; Note: The value must start with a leading slash (/). The value can be ; anything,but it may not be a good idea to use the .PHP extension or it ; may conflict with a real PHP file. ; Default Value: not set ping.path = /ping ; This directive may be used to customize the response of a ping request. The ; response is formatted as text/plain with a 200 response code. ; Default Value: pong ping.response = pong ; The timeout for serving a single request after which the worker process will ; be killed. This option should be used when the 'max_execution_time' ini option ; does not stop script execution for some reason. A value of '0' means 'off'. ; Available units: s(econds)(default),or d(ays) ; Default Value: 0 ;request_terminate_timeout = 0 ; The timeout for serving a single request after which a PHP backtrace will be ; dumped to the 'slowlog' file. A value of '0s' means 'off'. ; Available units: s(econds)(default),or d(ays) ; Default Value: 0 ;request_slowlog_timeout = 0 ; The log file for slow requests ; Default Value: not set ; Note: slowlog is mandatory if request_slowlog_timeout is set ;slowlog = log/$pool.log.slow ; Set open file descriptor rlimit. ; Default Value: system defined value ;rlimit_files = 1024 ; Set max core size rlimit. ; Possible Values: 'unlimited' or an integer greater or equal to 0 ; Default Value: system defined value ;rlimit_core = 0 ; Chroot to this directory at the start. This value must be defined as an ; absolute path. When this value is not set,chroot is not used. ; Note: you can prefix with '$prefix' to chroot to the pool prefix or one ; of its subdirectories. If the pool prefix is not set,the global prefix ; will be used instead. ; Note: chrooting is a great security feature and should be used whenever ; possible. However,all PHP paths will be relative to the chroot ; (error_log,sessions.save_path,...). ; Default Value: not set ;chroot = ; Chdir to this directory at the start. ; Note: relative path can be used. ; Default Value: current directory or / when chroot ;chdir = /var/www ; Redirect worker stdout and stderr into main error log. If not set,stdout and ; stderr will be redirected to /dev/null according to FastCGI specs. ; Note: on highloaded environement,this can cause some delay in the page ; process time (several ms). ; Default Value: no ;catch_workers_output = yes ; 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 ; Additional PHP.ini defines,specific to this pool of workers. These settings ; overwrite the values prevIoUsly defined in the PHP.ini. The directives are the ; same as the PHP SAPI: ; PHP_value/PHP_flag - you can set classic ini defines which can ; be overwritten from PHP call 'ini_set'. ; PHP_admin_value/PHP_admin_flag - these directives won't be overwritten by ; PHP call 'ini_set' ; For PHP_*flag,valid values are on,off,1,true,false,yes or no. ; Defining 'extension' will load the corresponding shared extension from ; extension_dir. Defining 'disable_functions' or 'disable_classes' will not ; overwrite prevIoUsly defined PHP.ini values,but will append the new value ; instead. ; Note: path INI options can be relative and will be expanded with the prefix ; (pool,global or /opt/PHP5) ; Default Value: nothing is defined by default except the values in PHP.ini and ; specified at startup with the -d argument ;PHP_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com ;PHP_flag[display_errors] = off ;PHP_admin_value[error_log] = /var/log/fpm-PHP.www.log ;PHP_admin_flag[log_errors] = on ;PHP_admin_value[memory_limit] = 32M PHP_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i