新主机建设各种吐血:Debian+Nginx+Php-fpm+MySql+phpMyAdmin

I couldn’t say anything except

    “去你妹的nginx!!”

对.htaccess的不支持彻底把我恶心到了……一晚上失败、失败、失败,几乎走投无路的时候发现了这篇文章:
http://romej.com/archives/515/nginx-rewrite-rules-for-wordpress-redux
07年的文章,非常老了,文章开头是这样一句:

Hmm, so this had greatly frustrated me a few weeks ago, to the point I gave up and just let it stew on the backburner, hoping someone would blog about a solution.
简单翻译:唉,这东西几个星期前就让我沮丧了,在那个时点上我就想放弃并把一切烦恼扔进燃烧炉,希望有人能够写一篇blog来解决这个问题。

这简直就是我的心情的写照啊!!
该文作者恶心的是nginx外挂php的各种缺陷(那个时候还没有我现在用的php-fpm),不过该作者对nginx的深刻研究给出了我需要的rewrite问题的答案,国内大部分解决方案都是以讹传讹,抄来抄去,只有这篇文章应该是真心把问题搞懂了。

location /blog/ {
      index index.php index.html;
      if (!-e $request_filename) {
        rewrite ^/blog/(.+)$ /blog/index.php?q=$1 last;
      }
}

如此一来我blog的大部分机能就已经回复了,黑名单和浏览器屏蔽暂无法实现,
邮件发送与cron任务也需要再花时间建设,虽然都很困难不过都不如rewrite重要。

接下来一大段用来记录我的安装过程,以备重装之需。


针对Debian+Nginx+Php-fpm+MySql+phpMyAdmin (待整理)

添加一个dotdeb的源(第三方),/etc/apt/sources.list里面

deb http://packages.dotdeb.org stable all

然后需要更新Gnu的公钥,依次执行

wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | sudo apt-key add -
rm dotdeb.gpg
sudo aptitude update
1.安装 php、 php-fpm 相关组件:
sudo aptitude install php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd php5-apc

或许是Debian的设计,或许是dotdeb包的原因,这些软件的配置文件基本都是两部分
一个总的,/etc/php5/fpm/php-fpm.conf (这个文件我没动过)
一个分站点用的,/etc/php5/fpm/pool.d/www.conf

#listen使用socket而不是使用端口,这个配置要和nginx的配置里设的一致
listen = /var/run/php5-fpm.sock
#这一行属于被强烈推荐启用的特性,我也觉得加个超时限制确实是比较合理的
request_terminate_timeout = 30s

至于那些mysql.so啊、mysqli.so啊之类的extension,已经自动生成了,可以在/etc/php5/conf.d/下确认对应ini文件。
值得注意的是suhosin.so我个人建议关闭。启用该插件后,会造成rand()函数执行时无视之前的srand($t)函数,默认先执行一遍srand()。

2.安装nginx作为http服务器
sudo aptitude install nginx

依然是主次两个配置
总的,/etc/nginx/nginx.conf,修改主要针对用户名、工作进程数、启用gzip

user www-data;
worker_processes 1;

##
# Gzip Settings
##
    
gzip on;
gzip_disable "msie6";
    
gzip_vary on;
gzip_min_length 1k;
# gzip_proxied any;
gzip_comp_level 2;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascrip$

分站点的简单说一下,sites-enabled与site-available是两个域名专用配置文件夹。
后者存放各个域名的配置,前者存放配置的符号链接。
/etc/nginx/sites-available/www.website.com,任意命名这个文件需要修改多处。

首先是针对http的显示部分,最底部是php配置,或许不是很安全的设定,仅供参考。

server {
	listen   80; 
	root /var/www/www.website.com;  #根目录,放哪里都可以,不过多处要一致
	index index.html index.htm index.php; #默认识别的index类型,别忘了php
	server_name localhost; #多域名多站点的时候直接写域名,单站点的直接localhost就可以了

	location / { 
	   		try_files $uri $uri/ /index.html;
	}
	access_log /var/log/nginx/website.access.log;
	error_log /var/log/nginx/website.error.log;
	
	location /doc/ {
		alias /usr/share/doc/;
		autoindex on;
		allow 127.0.0.1;
		deny all;
	}
	error_page 404 /404.html;
	
	error_page 500 502 503 504 /50x.html;
	location = /50x.html {
		root /var/www/www.website.com;
	}
	
	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	#
	location ~ \.php$ {
		# With php5-fpm:
		fastcgi_pass unix:/var/run/php5-fpm.sock; #与php-fpm里一致
		fastcgi_index index.php;                  #这个只要php就好
		fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;  #这个固定这么写就好,$document_root$=/var/www/www.website.com/
		include fastcgi_params;
	}
[...]
}

再建立一个符号链接

ln -s /etc/nginx/sites-available/www.website.com /etc/nginx/sites-enabled/www.website.com
3.恶心的权限问题
确保www-data属于www-data组 sudo groups www-data

如果要单独登录www-data,设一个密码
sudo passwd www-data

确保/var/www/www.website.com及其所有子文件夹、文件属于www-data:www-data
sudo chown -R www-data:www-data /var/www/www.website.com
确保/var/www属于root:root,默认如此;如不是,则执行
sudo chown root:root /var/www
确保/var/www及其所有子文件夹权限为755,子文件是644,默认如此;如不是,请参考下条基本语句。
sudo chmod 755 *
sudo chmod 644 .

4.安装MySql
sudo aptitude install mysql
sudo mysql_secure_installation #装完后执行,这就是个神命令。

尽管大部分都已经被神命令配置好了,我还是要指出手工配置的位置,
此文件/etc/mysql/my.cnf,略有修改

no-auto-rehash #禁用此物提高效率
5.安装phpMyAdmin
sudo aptitude install phpmyadmin #自动配置对于nginx来说不好用,一个esc一个否
sudo dpkg-reconfigure phpmyadmin 
之后手工配置/etc/nginx/sites-available/www.website.com
server {
[...]
        location /phpmyadmin {
               root /usr/share/;
               index index.php index.html index.htm;
               location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass unix:/var/run/php5-fpm.sock;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                       include /etc/nginx/fastcgi_params;
               }
               location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                       root /usr/share/;
               }
        }
        location /phpMyAdmin {
               rewrite ^/* /phpmyadmin last;
        }

	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
	#	deny all;
	#}
[...]
}

除此之外,另外还要在phpmyadmin页面上导入以下sql,才能启用大部分功能
/usr/share/doc/phpmyadmin/examples/create_tables.sql.gz
高版本phpMyAdmin的毛病,用数据库存自身配置……