1. 程式人生 > >LNMP架構搭建與優化

LNMP架構搭建與優化

linux

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架構搭建與優化