一、操作系統級環境及軟體版本 操作系統:CentOS release 6.5 (Final)minimal 內核版本:2.6.32-431.el6.x86_64 MySQL版本:MySQL-5.6.28 nginx版本:nginx-1.8.1 php版本:php-5.6.19 二、安裝MySQL-5
一、操作系統級環境及軟體版本
操作系統:CentOS release 6.5 (Final)minimal
內核版本:2.6.32-431.el6.x86_64
MySQL版本:MySQL-5.6.28
nginx版本:nginx-1.8.1
php版本:php-5.6.19
二、安裝MySQL-5.6.28
獲取地址:http://mirrors.sohu.com/mysql/自行選擇想要的版本
mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz這個版本是官方編譯好的版本,解壓後直接初始化即可使用,如果使用源碼編譯安裝需要註意的是MySQL5.5版本以後要用cmake進行編譯,編譯時需要事先安裝cmake。
解壓mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz
# tar -zxvf mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz
將解壓後的文件移動到/usr/local/下並命名為mysql
# mv mysql-5.6.28-linux-glibc2.5-x86_64 /usr/local/mysql
創建mysql用戶沒有家目錄,並且不能登錄
# useradd -M mysql -s /sbin/nologin
創建資料庫文件存儲位置
# mkdir -p /database/mysql
將所有者和所屬組改為mysql
# chown -R mysql.mysql /database/mysql/
初始化資料庫
# ./scripts/mysql_install_db --user=mysql --datadir=/database/mysql
將mysql的二進位bin目錄添加到用戶的環境變數中
# vim ~/.bash_profile
將/usr/local/mysql/bin添加到PATH中
# source ~/.bash_profile
配置mysql的環境並且開機自啟動
# cp mysql.server /etc/init.d/mysqld
一定要執行這個,否則後悔莫及,不解釋
# sed -i 's#^datadir=#datadir=/database/mysql#' /etc/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on
編輯mysql的配置文件
# vim /usr/local/mysql/my.cnf
添加如下內容不配置主從的情況下的配置:
basedir=/usr/local/mysql
datadir=/database/mysql/data
port=3306
socket=/tmp/mysql.sock
lower_case_table_names=1
key_buffer_size=256M
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=4M
myisam_sort_buffer_size=64M
thread_cache_size=16
query_cache_size=16M
thread_concurrency=4
interactive_timeout=8
wait_timeout=8
slow_query_log=on
long_query_time=1
slow-query-log-file=/database/mysql/slow.log
具體參數參考MySQL常用配置
三、安裝php
安裝php之前先安裝差不多用到的包
# yum -y install openssl-devel bzip2-devel libxml2-devel curl-devel libpng-devel libjpeg-devel freetype-devel libtool-ltdl-devel perl-devel
安裝epel-release擴展源
rpm -ivh " http://www.lishiming.net/data/attachment/forum/epel-release-6-8_64.noarch.rpm "
# yum -y install libmcrypt-devel
創建php-fpm用戶
# useradd -M php-fpm -s /sbin/nologin
# tar zxvf php-5.6.19.tar.gz
# cd php-5.6.19
# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql/ --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --disable-ipv6
# make -j 2
# make install
# cp php.ini-production /usr/local/php/etc/php.ini
將php-fpm添加到系統服務並設置為開機自啟動
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# chmod 755 /etc/init.d/php-fpm
# chkconfig --add php-fpm
# chkconfig php-fpm on
# cd /usr/local/php/etc/
# mv php-fpm.conf.default php-fpm.conf
檢查php-fpm的位置文件是否正確
# /usr/local/php/sbin/php-fpm -t
啟動php-fpm
# service php-fpm start
四、安裝nginx
# tar -zxvf nginx-1.8.1.tar.gz
# cd nginx-1.8.1
# ./configure --prefix=/usr/local/nginx --with-pcre
# make -j 2
# make install
啟動nginx
# /usr/local/nginx/sbin/nginx
去配置文件里將php的配置項打開
# vim /usr/local/nginx/conf/nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
重新載入nginx配置文件
# /usr/local/nginx/sbin/nginx -s reload
在/usr/local/nginx/html目錄先可以創建php的信息頁進行測試五五、php-fpm常用跟配置
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/www.sock
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
slowlog = /tmp/phpslow.log
request_slowlog_timeout = 1
六、常見的502錯誤
主要是因為nginx對php-fpm的sock沒有讀寫許可權造成的,還有一點就是在搭建discuz論壇的時候discuz目錄下的許可權應該對php-fpm用戶有度讀寫的許可權才可以,並不是nginx。
# chown -R php-fpm:php-fpm /web/discuz/
七、nginx用戶認證
在discuz的配置文件中加入下麵的內容
location ~ .*admin\.php$ {
auth_basic "fanjinbao auth";
auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
include fastcgi_params;
fastcgi_pass unix:/tmp/discuz.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /web/discuz$fastcgi_script_name;
}
.htpasswd文件需要藉助於apahce的密碼生成工具才可以哦
八、nginx功能變數名稱跳轉
在discuz.conf的server中添加如下內容:
if ($host != 'www.discuz.com')
{
rewrite ^/(.*)$ http://www.discuz.com/$1 permanent;
}
九、nginx不記錄指定文件類型日誌
在discuz.conf的server中添加如下內容:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
access_log off;
}
location ~ (static|cache)
{
access_log off;
}
十、nginx的日誌切割腳本
#!/bin/bash
d=`date -d "-1 day" +%F`
[ -d /tmp/nginx_log ] || mkdir /tmp/nginx_log
mv /web/discuz.log /tmp/nginx_log/$d.log
/etc/init.d/nginxd reload > /dev/null
cd /tmp/nginx_log/
gzip -f $d.log
十一、nginx配置靜態文件過期時間
location ~ \.(js|css)
{
access_log off;
expires 2h;
}
十二、nginx配置防盜鏈
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
access_log off;
expires 15d;
valid_referers none blocked *.discuz.com *.fansik.com;
if ($invalid_referer)
{
return 403;
}
}
測試防盜鏈是否配置成功可以使用curl命令進行測試:
# curl -e "http://www.baidu.com/111" -x127.0.0.1:80 'http://www.discuz.com/static/image/common/logo.png' -I
這個返回的狀態碼肯定是403
# curl -e "http://www.fansik.com/111" -x127.0.0.1:80 'http://www.discuz.com/static/image/common/logo.png' -I
這個返回的狀態碼肯定是200
十二、nginx的訪問控制
直接在配置文件(或者location中)添加
allow 127.0.0.1;
deny 1.1.1.1;
十三、nginx禁止指定user_agent
if ($http_user_agent ~* 'curl|baidu|11111')
{
return 403;
}
~*:不區分大小寫
十四、nginx代理和負載
upstream baidu{
server 61.135.169.125:80;
server 61.135.169.121:80;
}
server {
listen 80;
server_name www.baidu.com;
location / {
proxy_pass http://baidu/;
proxy_set_header Host $host;
}
}