新主机建设各种吐血: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的毛病,用数据库存自身配置……