0

我在本地机器(Mac OSX 10.8)上的 nginx 网络服务器上运行了 codeigniter(php 框架)。

我正在尝试连接到由 mediaTemple 托管的外部 mySQL 数据库。

在 codeigniter 中加载数据库助手时,使用所有正确的详细信息,我不断得到:

  A Database Error Occurred
  Unable to connect to your database server using the provided settings.

我的 database.php 文件的内容是:

  $db['default']['hostname'] = 'external-db.#######.gridserver.com';
  $db['default']['username'] = '#######';
  $db['default']['password'] = '#######';
  $db['default']['database'] = '#######_olliejennings';
  $db['default']['dbdriver'] = 'mysql';
  $db['default']['dbprefix'] = '';
  $db['default']['pconnect'] = TRUE;
  $db['default']['db_debug'] = TRUE;
  $db['default']['cache_on'] = FALSE;
  $db['default']['cachedir'] = '';
  $db['default']['char_set'] = 'utf8';
  $db['default']['dbcollat'] = 'utf8_general_ci';
  $db['default']['swap_pre'] = '';
  $db['default']['autoinit'] = TRUE;
  $db['default']['stricton'] = FALSE;

我的 nginx.conf 文件的内容是:

  daemon off;

  user olliejennings staff;

  worker_processes 2;
  pid /opt/boxen/data/nginx/nginx.pid;

  events {
     worker_connections 1024;
  }

  http {
     include mime.types;
     default_type application/octet-stream;

     log_format main '$remote_addr - $remote_user [$time_local] $status '
                     '"$request" $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "http_x_forwarded_for"';

     access_log /opt/boxen/log/nginx/access.log main;
     error_log  /opt/boxen/log/nginx/error.log debug;

     sendfile on;

     tcp_nopush  on;
     tcp_nodelay off;

     gzip              on;
     gzip_http_version 1.0;
     gzip_comp_level   2;
     gzip_proxied      any;

     upstream www-upstream-pool {
          server unix:/tmp/php-fpm.sock;
     }

     server {
          listen      80;
          server_name localhost;

          location / {
               root   /opt/boxen/config/nginx/public;
          }
     }

     include /opt/boxen/config/nginx/sites/*;
  }

我的 sites/olliejennings.conf 文件的内容是:

  server {
       server_name      olliejennings.dev;
       root         /Users/olliejennings/Code/olliejennings;
       index        index.php index.html index.htm;

       location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
         expires max;
         log_not_found off;
         add_header Pragma public;
         add_header Cache-Control "public, must-revalidate, proxy-revalidate";
       }

       location / {
         # Check if a file exists, or route it to index.php
         try_files $uri $uri/ /index.php;
       }

       location ~ \.php$ {
         include fastcgi_php_default.conf;
         fastcgi_pass 127.0.0.1:9000;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME $document_root/index.php;
       }
   }

注意:如果我不尝试连接到外部数据库,php 网站工作正常。


编辑 - 发现差异是 nginx 和 apache 之间的 mySQL 设置

这是我连接到 apache 上的数据库时 phpinfo() 抛出的内容:

使用 apache 时的 mySQL 配置

这是使用 nginx 时 phpinfo() 抛出的内容,因为我无法连接到数据库:

使用 nginx 时的 mySQL 配置

使用 nginx 时 mySQL 的套接字也是错误的,因为它不位于

/var/mysql/mysql.sock

而是位于:

/temp/mysql.sock

我已经在 php.ini 文件中更改了这些设置,但是在使用 nginx 时它们似乎没有被 php 读取,它似乎忽略了该文件中的任何更改。

4

1 回答 1

1

好的,所以我终于设法解决了这个问题。

当我尝试使用本机 php mysqli 时,stormdrain建议我收到以下消息:

Connect failed: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.

所以为了解决这个问题,我做了以下事情:

  1. 使用 phpmyadmin 连接到 mysql 数据库
  2. 运行以下查询SHOW VARIABLES LIKE 'old_passwords'
  3. 如果返回ON,那么我知道问题出在数据库上。
  4. 运行此查询以关闭此变量 -SET SESSION old_passwords=FALSE;

然后我能够连接到 mySQL 数据库而没有任何问题或代码更改。

于 2013-04-12T09:03:15.640 回答