快速配置LNMP环境Nginx0.8.54+MYSQL5.5.16+PHP5.3.8+CentOS 6
最近购买了Linode的VPS服务,就开始着手以Nginx 为基础搭建LNMP平台,体验Nginx的魅力。Linux OS选择的是Linode的CentOS 6,话说CentOS 6出来太慢了。。。
仅此篇文章记录配置生产环境的过程。
安装Nginx 和 PHP
- 修改你的hostname
echo "HOSTNAME=baby" >> /etc/sysconfig/network
hostname "baby"
- 编辑你的/etc/hosts。添加以下
127.0.0.1 localhost.localdomain localhost
12.34.56.78 baby.example.com baby
- 添加EPEL软件仓库,为Fedora 开发的仓库,同样适用CentOS 6.
rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm
利用yum 安装Nginx ,PHP,Spawn-fcgi,安装时会询问导入EPEL的key文件,直接y就ok。
yum install nginx php-cli php make automake gcc gcc-c++ spawn-fcgi wget
- 添加nginx服务,设置开机启动,开启nginx
chkconfig --add nginx
chkconfig --level 35 nginx on
service nginx start
现在访问你的IP地址,可以看到nginx的默认页面。
- 可以开始配置,创建网站文件夹。
mkdir -p /srv/www/www.xbc.me/public_html
mkdir /srv/www/www.xbc.me/logs
chown -R nginx:nginx /srv/www/www.xbc.me
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
在你的/etc/nginx/nginx.conf添加不同网站的配置文件
# Load virtual host configuration files.
include /etc/nginx/sites-enabled/*;
添加网站配置文件/etc/nginx/sites-available/www.xbc.me
server {
server_name www.xbc.me xbc.me;
access_log /srv/www/www.xbc.me/logs/access.log;
error_log /srv/www/www.xbc.me/logs/error.log;
root /srv/www/www.xbc.me/public_html;
location / {
index index.html index.htm index.php;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/www.xbc.me/public_html$fastcgi_script_name;
}
}
在nginx启用网站配置文件
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/www.xbc.me
service nginx restart
- 配置spawn-fcgi
cd /opt
wget -O php-fastcgi-rpm.sh http://library.linode.com/assets/696-php-fastcgi-rpm.sh
mv php-fastcgi-rpm.sh /usr/bin/php-fastcgi
chmod +x /usr/bin/php-fastcgi
wget -O php-fastcgi-init-rpm.sh http://library.linode.com/assets/697-php-fastcgi-init-rpm.sh
mv php-fastcgi-init-rpm.sh /etc/rc.d/init.d/php-fastcgi
chmod +x /etc/rc.d/init.d/php-fastcgi
chkconfig --add php-fastcgi
chkconfig php-fastcgi on
/etc/init.d/php-fastcgi start
- 启动spawn-fcgi服务,可以测试PHP
新建文件/srv/www/www.xbc.me/public_html/test.php
安装mysql数据库
yum install mysql-server
添加mysqld开机服务
/sbin/chkconfig --levels 235 mysqld on
启动mysql守护进程
/etc/init.d/mysqld start
配置MYSQL,进行安全安装。
mysql_secure_installation
这条命令会
提示你创建root密码
删除匿名用户
禁用root从localhost以外登录
删除测试数据库
提示刷新权限表
强烈推荐全部选择YES!!!
安装PHP常用扩展
安装扩展pear、mysql、apc加速器。
yum install php-pear
yum install php-mysql
yum install php-pecl-apc
重启php-fastcgi
killall php-cgi
php-fastcgi start
访问网站子目录出现403 Forbidden错误,假设子目录为ecshop,修改网站配置文件/etc/nginx/sites-available/www.xbc.me
location /ecshop/ {
index index.php;
}
出现错误FastCGI sent in stderr: “PHP Warning: Unknown: open(/var/lib/php/session/
/var/lib/php 权限预设为root apache,因为我们安装的是nginx,运行用户为nginx。
修改为root nginx 即可
Spawn-fastcgi 和 Php-fpm
从spawn-fastcgi转到php-fpm,最大的好处是内存占用小、稳定、可以无需重启载入配置。
默认CentOS 6的php版本是5.3.2,而php-fpm自从5.3.3以后的版本就集成了php-fpm,成为官方的人了。orz….
为了能贴近文章的标题,特找到一偷懒的方法利用yum 升级php–利用第三方的仓库remi。
添加remi仓库
cd /opt
wget http://rpms.famillecollet.com/RPM-GPG-KEY-remi
导入验证key文件
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
验证rpm包
rpm -K remi-release-6.rpm
添加remi 仓库
rpm -i remi-release-6.rpm
更新,如果已经安装ldop扩展,需要先删除,可能会出现依赖的问题。
yum remove php-ldap #to squash later dependency issues
升级php 和mysql
yum --enablerepo=remi update mysql php
升级完成后,PHP的版本为5.3.8,MYSQL为5.5.16
安装php-fpm
yum --enablerepo=remi install php-fpm
MYSQL升级完成后,出现
Missing system table mysql.proxies_priv; please run mysql_upgrade to create it
MYSQL需要运行mysql_upgrade升级脚本,如果运行命令出错,请用root来执行。
mysql_upgrade -u root -p
服务器优化
安装好LNMP环境后,可优化下配置,发挥服务器最大性能。这里主要讲后端的优化,前端优化请参考Yahoo的前端优化最佳实践。
服务器硬件
内存: 768M
CPU: Intel(R) Xeon(R) CPU L5520 @ 2.27GHz 四核
带宽: 百兆共享
机房所在地:美国加利福尼亚州
Nginx配置优化/etc/nginx/nginx.conf参数,仅供参考。
cat /etc/nginx/nginx.conf | grep -v "#"
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1000;
gzip_buffers 4 8k;
gzip_types text/plain application/x-javascript text/css application/xml;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
server {
listen 80;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
主机配置文件/etc/nginx/sites-enabled/www.xbc.me
cat /etc/nginx/sites-enabled/www.xbc.me | grep -v "#"
server {
server_name www.xbc.me xbc.me;
access_log /srv/www/www.xbc.me/logs/access.log;
error_log /srv/www/www.xbc.me/logs/error.log;
root /srv/www/www.xbc.me/public_html;
location / {
index index.html index.htm index.php;
}
location /phpmyadmin/ {
if (!-e $request_filename) {
rewrite ^.+/?(/phpmyadmin/.*\.php)$ $1 last;
rewrite ^(.+)$ /phpmyadmin/index.php?q=$1 last;
}
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME /srv/www/www.xbc.me/public_html$fastcgi_script_name;
}
location ~* \.(js|css|jpg|jpeg|gif|png)$ {
if (-f $request_filename) {
expires 30d;
break;
}
}
}
MYSQL参数优化/etc/my.cnf
cat /etc/my.cnf | grep -v "#"
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysqld]
datadir=/var/lib/mysql
user=mysql
symbolic-links=0
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 256K
join_buffer_size = 512K
read_buffer_size = 512K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
default-storage-engine = MyISAM
skip-innodb
skip-name-resolve
external-locking = FALSE
slow_query_log
slow_query_log_file=/tmp/slow.log
long_query_time = 1
query_cache_size = 1M
max_heap_table_size = 32M
tmp_table_size = 32M
max_connections =8
thread_stack = 192K
thread_cache = 128
thread_cache_size = 10
thread_concurrency = 8
bind-address = 173.255.248.110
log-bin=mysql-bin
binlog_format=mixed
expire_logs_days = 30
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
PHP配置优化,尽可能的加载可能少的模块,添加php加速器apc、eaccelerator
设置php的内存限制
memory_limit = 16M
php-fpm 配置优化
cat /etc/php-fpm.d/www.conf | grep -v ";"
[www]
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
user = nginx
group = nginx
pm = dynamic
pm.max_children = 32
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 8
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
参考
http://library.linode.com/web-servers/nginx/php-fastcgi/centos-5
http://library.linode.com/lamp-guides/centos-6#sph_install-mysql
http://www.clearfoundation.com/component/option,com_kunena/Itemid,232/catid,17/func,view/id,18743/
http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/
http://engin.bzzzt.biz/2011/04/06/mysql-workbench-fetching-problem-solved/