LNMP架構搭建與優化
1,1php編譯與安裝
LAMP
apache、mysql、php
LNMP
nginx、mysql、php
mysql的安裝與LAMP的mysql安裝方法一樣
先安裝mysql再安裝php
cd /usr/local/src
wget http://cn2.php.net/distributions/php-5.4.37.tar.bz2 下載
tar jxvf php-5.4.37.tar.bz2 解壓
cd php-5.4.37
./configure --prefix=/export/servers/php --with-config-file-path=/export/servers/php/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/export/servers/mysql --with-mysql-sock=/export/Data/mysql/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 --with-curl 編譯(其中enable-fpm為最關鍵的工具)
make
echo $? 查看有沒有錯誤 顯示0正確
make install
echo $?
在make install前可以先把本機之前的php目錄刪除rm -rf /usr/local/php
cp php.ini-production /usr/local/php/etc/php.ini 拷貝配置文件
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/
ls
mv php-fpm.conf.default php-fpm.conf 把樣本配置文件重命名
useradd -s /sbin/nologin php-fpm 添加用戶php-fpm,編譯時指定了用戶和組就是php-fpm
service php-fpm start 啟動服務
ps aux |grep php-fpm 查看進程
netstat -lnp 查看監聽端口
1,2安裝nginx
vim /etc/init.d/nginx
黏貼寫入保存
:wq
chmod 755!$ 更改權限
chkconfig --add nginx 加入到啟動列表
chkconfig nginx on 開機啟動
service nginx start 成功啟動
編輯完啟動腳本後重新整理配置文件
vim /usr/local/nginx/conf/nginx.conf 打開nginx的配置文件
> /usr/local/nginx/conf/nginx.conf 全部去掉 ,“>” 這個符號之前阿銘介紹過,為重定向的意思,單獨用它,可以把一個文本文檔快速清空
vim /usr/local/nginx/conf/nginx.conf 打開nginx的配置文件
http://www.apelearn.com/study_v2/chapter18.html,把裏面更加nginx配置的內容復制到配置文件裏,內容分為兩部分,一部分為配置的整體部分,另一部分server為虛擬主機部分,
{{可以把兩部分拆分開來,例如不把server部分復制進配置文件裏,這配置文件的最後一行gzip下添加include vhosts、*.conf; (nginx支持include)
:wq
pwd
cd /usr/local/nginx/conf/
mkdir vhosts
cd vhosts
vim default.conf
把server部分拷貝過來
在80後添加 default_server
如果為了限制 }} 往後學習再研究。。。
/usr/local/nginx/sbin/nginx -t 保存配置後,先檢驗一下配置文件是否有錯誤存在
service nginx start
ps aux |grep nginx
CtrlR可以快速搜索調用使用過的命令
1,5php-fpm配置文件
/usr/local/php/etc/php.ini管理php的全局配置
/usr/local/php/etc/php-fpm.conf 管理php-fpm服務的配置
> /usr/local/php/etc/php-fpm.conf 清空
http://www.apelearn.com/study_v2/chapter18.html 安裝php的7.修改配置文件,拷貝內容
vim /usr/local/php/etc/php-fpm.conf
粘貼內容
[global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/php-fpm.log [www] ([www]是pool的名字,pool在ps aux|grep php-fpm命令下可以顯示,創建不同的pool可以監聽不同的端口或者控制不同得到域名) listen = /tmp/php-fcgi.sock (領用sock的方式監聽,可以改為/tmp/www.sock) user = php-fpm group = php-fpm pm = dynamic (動態的,管理下面的pm.,所有改為static,只有pm.max_children = 50 有效) pm.max_children = 50 (最大50個子進程) pm.start_servers = 20 (一開始20個) pm.min_spare_servers = 5 (空閑時最少) pm.max_spare_servers = 35 (空間時最多) pm.max_requests = 500 (每一個子進程 在生命周期內一共處理多少個請求,自動銷毀) rlimit_files = 1024 (每一個進程所使用文件描述符的限制)
再創一個pool
[www1] listen = /tmp/www1.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
:wq
/usr/local/php/sbin/php-fpm -t 檢查文件有沒有錯誤
/etc/init.d/php-fpm restart
ps aux|grep php-fpm 查看pool
啟動多個pool的好處
不同的pool控制不同的域名,也可以不同域名共用一個pool
pool可以分開使用不同權限
若只用一個pool,一個網站掛了其他也會跟著掛
跟蹤操作
網站運行瀏覽慢
在【www】最後添加
slowlog = /tmp/www_slow.log
request_slowlog_timeout = 1 (腳本執行時間超過一秒就記錄slow.log,讓自己看到腳本哪裏進行慢,
利用/tmp/www_slow.log排查出問題)
php_admin_value[open_basedir]=/data/www/:/tmp/ (不同的pool設置不同的open basedir,限制不同的域名)
:wq
1,6常見的502問題解決
nginx的高級配置
把之前裝的論壇 discuz實現在nginx下訪問
之前用的域名 www.test.com
cd /usr/local/nginx/conf/vhosts/
ls
mv 111.conf test.conf
vim test.conf
server name 改為www.test.com;
#禁用一個fastcgi_pass,另一個改為unix;/tmp/www.sock ;
:wq
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
外部瀏覽器訪問www.test.com
出現502問題
查看nginx的錯誤日誌error_log
error_log的位置可以在nginx.com裏查看
vim /usr/local/nginx/conf/nginx.conf
找出error_log的位置
cat vim /usr/local/nginx/logs/nginx_error.log
找出錯誤,出現502,發現權限不夠,不能讀寫該文件
ls -l /tmp/www.sock
vim /usr/local/php/etc/php-fpm.conf
group下添加配置,關於監聽的用戶和組的指定nobody
listen.owner = nobody
listen.group = nobody
:wq
/etc/init.d/php-fpm restart
外部訪問
www.test.com
解決了502問題
1,7nginx用戶認證
雙層密碼,在進入admin前還要再輸一層密碼
cd /usr/local/nginx/conf/vhosts
ls
vim test.conf
在root下面添加
location ~ .*admin\.php$ {
auth_basic "aminglinux auth";
auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
把下面的include、fastcgi_pass、fastcgi_index、fastcgi_param都拷貝到這裏
}
:wq
利用apache生成密碼的工具htpasswd創建文件 /usr/local/nginx/conf/.htpasswd
(若沒有htpasswd,就yum install httpd)
htpasswd -c /usr/local/nginx/conf/.htpasswd aming
輸入密碼
創建用戶和密碼成功,若想再創建另一個用戶,則不用-c和更加名字
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
驗證:curl -x127.0.0.1:80 -uaming:密碼 www.test.com/admin.php
顯示出</tr></table></body></html>等就證明php已解析,創建成功
也可以外部瀏覽器登陸www.test.com/進入管理中心
1,8nginx域名跳轉
和apache的域名別名相似
vim /usr/local/nginx/conf/vhosts/test.conf
一個網站多個域名
在server_name 後所有域名都直接寫上
例如www.test.com為主,www.aaa.com為次
永久重定向301或302,目的:讓搜索引擎更加友好,加重對域名的權重,讓網友更容易搜索到頁面和域名
server_name www.test.com www.aaa.com;
if ($host !=‘www,test.com‘)
{
rewrite ^/(.*)$ http ://www.test.com/$1 permanent; (301)
}
:wq
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 www.aaa.com/afafwaegeges -I(大寫i)
驗證301和跳轉到www.test.com/afafwaegeges
(lst - 基本上都用這個Flag,break - 中止Rewirte,不再繼續匹配,redirect -返回臨時重定向的HTTP狀態302,permanent - 返回永久重定向的HTTP狀態301。。。更多了解尋找nginx中如何配置301和302的帖子)
1,9nginx不記錄指定文件類型日誌
vim /usr/local/nginx/conf/vhosts/test.conf
log_format 就是日誌的格式 combined_realip 就是日誌的名字,可以改為簡單些,列如改為aming,remote_addr遠程ip,http_x_forwarded_for 代理ip,time時間,host域名,uri訪問的地址,status狀態碼
vim /usr/local/nginx/conf/vhosts/test.conf
在root下面添加
access_log /tmp/access.log aming;
:wq
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x......或者外部瀏覽器訪問一下
cat /tmp/access.log 查看日誌的記錄
不記錄靜態圖片或者指定格式的東西
vim /usr/local/nginx/conf/vhosts/test.conf
在location 。。admin。。php下一段添加
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
access_log off;
}
location ~ (static|cache)
{
access_log off;
}
:wq
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x......或者外部瀏覽器訪問一下
cat /tmp/access.log 查看日誌的記錄
日誌裏已經不記錄上面指定的東西了
2,0nginx日誌切割
需要自己寫一個日誌切割的腳本
vim /usr/local/sbin/nginx_logrotate.sh
#!/bin/bash d=`date -d "-1 day" +%F` (今天切割昨天的日誌) [ -d /tmp/nginx_log ] || mkdir /tmp/nginx_log (|| 前面命令成功就不執行後面命令,不成功就執行後面命令) mv /tmp/access.log /tmp/nginx_log/$d.log /etc/init.d/nginx reload > /dev/null (重定向) cd /tmp/nginx_log/ gzip -f $d.log (壓縮日誌和強制覆蓋)
sh -x /usr/local/sbin/nginx_logrotate.sh 執行腳本顯示過程
應該把執行切割日誌的任務命令加入到任務計劃裏面去,每天都進行切割日誌
2,1nginx配置靜態文件過期時間
靜態文件的緩存,即過期時間
vim /usr/local/nginx/conf/vhosts/test.conf
使用location方式
在access_ log off;下添加
expires 15d ;(保存15天)
:wq
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
在瀏覽器論壇頁面按F12,Network查看設置的指定格式文件的max-age過期時間
也可以用curl -x指令訪問文件的URL地址,查看max-age
2,2nginx配置防盜鏈
依據referer
防盜鏈也在location裏配置
vim /usr/local/nginx/conf/vhosts/test.conf
例如為 gif|jpg|jpeg 等配防盜鏈
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|mp4|flv|rar|zip|gz|bz2)$
{
expires 15d;
access_log off;
valid_referers none blocked *.test.com *.aaa.com;(允許這兩個域名使用)
if ($invalid_referer)
{
return 403; (其他域名使用這些文件會顯示403)
}
}
:wq
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
在瀏覽器論壇頁面按F12,Network查看設置的指定格式文件的url
用curl -e"要使用的ip地址" -I -x127.0.0.1:80 ‘該圖片或文件的URL’
查看防盜鏈是否生效
2,3nginx訪問控制
設置白名單:允許訪問的ip
設置黑名單:拒絕訪問的ip
vim /usr/local/nginx/conf/vhosts/test.conf
要設置整個網站的限制,在location外,root下添加
allow 允許的ip;
deny all; (白名單)
或
deny 禁止的ip;
(黑名單)
要設置網站內某些地方的限制,列如管理員中心,在location admin那段中添加
allow 允許的ip;
deny all; (白名單)
或
deny 禁止的ip;
(黑名單)
192.168.1.0/24 整個192.168.1的網段
2,4nginx禁止指定user_agent
網站訪問很大,服務器空間資源不夠,通過user_agent禁止某些不重要搜索鏈接
vim /usr/local/nginx/conf/vhosts/test.conf
在location外添加
if ($http_user_agent ~* ‘curl|baidu|1111‘) (~*同時用不區分大小寫匹配)
{
return 403;
} (user_agent含有curl,baidu,1111都會禁止訪問)
:wq
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
測試
curl -A “隨便賦予的user_agent” -x。。。。
若隨便賦予的user_agent裏含有curl,baidu,1111都會顯示出403)
2,5nginx代理詳解
假設代理百度一個ip地址
vim /usr/local/nginx/conf/vhosts/proxy.conf
server{
listen 80;
server_name www.baidu.com;
location / {
proxy_pass http://百度的ip(可用ping www.baidu.com查看)/;
# proxy_set_header Host $host;
}
}
:wq
假設代理百度兩個個ip地址
vim /usr/local/nginx/conf/vhosts/proxy.conf
upstream aming{
server 第一個百度ip;
server 第二個百度ip ;
}
server {
listen 80;
server_name www.baidu.com;
location / {
proxy_pass http://aming/;
proxy_set_header Host $host;
}
}
:wq
LNMP架構搭建與優化