linux版本:64位CentOS 6.4javascript
Nginx版本:nginx1.8.0php
php版本:php5.5.28css
1.編譯安裝Nginxhtml
官網:http://wiki.nginx.org/Installjava
下載:http://nginx.org/en/download.htmlmysql
一、首先確保系統安裝GCC編譯器及相關工具(autoconf 和automake他們用於自動建立功能完善的makefile,當前大多數軟件包都是使用這一工具生成的makefile的)linux
# yum -y install gcc gcc-c++ autoconf automakenginx
二、Nginx須要依賴下面3個包c++
注意:若是用源碼安裝的話,後面nginx安裝的時候須要指定 --with-pcre 對應的壓縮包路徑,若是用二進制包安裝則不需指定git
依賴包一鍵安裝: yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel
# wget http://nginx.org/download/nginx-1.8.0.tar.gz
# tar -zvxf nginx-1.8.0.tar.gz
# cd ./nginx-1.8.0
#groupadd -r nginx
#useradd -r -g nginx -s /bin/false -M nginx
#./configure --prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_gzip_static_module \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi/
或者默認安裝目錄(
#注意 \ 前面至少一個有空格 ./configure --sbin-path=/usr/local/nginx/nginx \ --conf-path=/usr/local/nginx/nginx.conf \ --pid-path=/usr/local/nginx/nginx.pid \ --with-http_ssl_module \ --with-pcre=../pcre-8.21 \ #指向解壓的源碼目錄 --with-zlib=../zlib-1.2.8 \ #指向解壓的源碼目錄 --with-openssl=../openssl-1.0.1 \ #指向解壓的源碼目錄 --with-http_stub_status_module \#啓用 nginx 的 NginxStatus 功能,用來監控 Nginx 的當前狀態 --user=nginx \ --group=nginx
)
# make && make install
安裝Nginx時報錯
錯誤提示:./configure: error: the HTTP rewrite module requires the PCRE library.
安裝pcre-devel解決問題
# yum -y install pcre-devel
錯誤提示:./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
--without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
--with-http_ssl_module --with-openssl=<path> options.
解決辦法:
# yum -y install openssl openssl-devel
或者一併安裝:
# yum -y install pcre-devel openssl openssl-devel
啓動nginx
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
安裝成功查看nginx進程
# ps aux | grep nginx
測試頁面,直接輸入服務器ip
其實nginx默認的web工做目錄在/usr/local/nginx/html
能夠修改nginx的配置文件nginx.conf改變到其餘路徑
防火牆配置
注意若是你但願在本地機器例如xp訪問虛擬機的網頁,若是是centos6須要修改防火牆啓動80端口
# cd /etc/sysconfig
修改iptables文件,或者直接用vim編輯
# vim /etc/sysconfig/iptables
添加下面一行,打開防火牆80端口:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
重啓防火牆
# /etc/init.d/iptables restart
查看CentOS防火牆信息:/etc/init.d/iptables status
關閉CentOS防火牆服務:/etc/init.d/iptables stop
中止nginx
查詢nginx主進程號
#ps -ef | grep nginx
從容中止Nginx:
kill -QUIT 主進程號
快速中止Nginx:
kill -TERM 主進程號
強制中止Nginx:
pkill -9 nginx
開啓目錄自動顯示
nginx的配置文件nginx.conf在
# cd /usr/local/nginx/conf
有時候須要開啓目錄自動顯示功能
重啓nginx
# /usr/local/nginx/sbin/nginx -s reload
獲取安裝信息
若是須要從新安裝nginx,須要知道以前的安裝信息
# /usr/local/nginx/sbin/nginx -V
2.安裝php
去www.php.net找下載最新的版本
http://www.php.net/downloads.php
下載解壓
# wget http://cn2.php.net/get/php-5.5.28.tar.gz/from/this/mirror
# tar zxvf php-5.5.28.tar.gz
# cd php-5.5.28
配置
#./configure --prefix=/usr/local/php \
--with-curl \
--with-freetype-dir \
--with-gd \
--with-gettext \
--with-iconv-dir \
--with-kerberos \
--with-libdir=lib64 \
--with-libxml-dir \
--with-mysql \
--with-mysqli \
--with-openssl \
--with-pcre-regex \
--with-pdo-mysql \
--with-pdo-sqlite \
--with-pear \
--with-png-dir \
--with-xmlrpc \
--with-xsl \
--with-zlib \
--enable-fpm \
--enable-bcmath \
--enable-libxml \
--enable-inline-optimization \
--enable-gd-native-ttf \
--enable-mbregex \
--enable-mbstring \
--enable-opcache \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvsem \
--enable-xml \
--enable-zip
若是須要--with-jpeg-dir \ 能夠按下面的裝不少yum
若是須要GD庫還要
./configure --prefix=/usr/local/php --with-mysql --enable-fpm--enable-opcache --with-freetype-dir --with-jpeg-dir --with-png-dir --with-gd --with-zlib --with-libxml-dir --enable-xml --disable-debug --enable-safe-mode --enable-mbstring
若是配置錯誤,須要安裝須要的模塊,直接yum一併安裝依賴庫
# yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel mysql pcre-devel
配置成功:
編譯安裝
配置成功後繼續完成編譯安裝php
# make && make install
php-5.4.11已經支持fastcgi了,不用在打補丁了。
1.在編譯安裝時加上'--enable-fpm',注意修改php/etc/php-fpm.conf 去掉pid前的註釋;
2.複製/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm還能夠作成服務
複製php-fpm文件到php安裝目錄
# cp -R ./sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf
拷貝php.ini文件
安裝目錄有2個文件:php.ini-development和php.ini-production
注意php.ini-production擁有較高的安全性設定,則適合上線當產品使用
# cp php.ini-development /usr/local/php/lib/php.ini
或者
# cp php.ini-production /usr/local/php/lib/php.ini
若是操做了這一步之後使用phpinfo()就會看到Loaded Configuration File:
php-fpm啓動
拷貝啓用文件
# cp -R ./sapi/fpm/php-fpm /etc/init.d/php-fpm
啓動
# /etc/init.d/php-fpm
php安裝成功查看進程
#ps aux|grep php
重啓
# killall php-fpm
# /etc/init.d/php-fpm
php-fpm配置中關於進程數的配置比較重要,其餘能夠默認:
user = www
group = www
#啓動進程的賬戶和組
pm = dynamic #對於專用服務器,pm能夠設置爲static。
#如何控制子進程,選項有static和dynamic。若是選擇static,則由pm.max_children指定固定的子進程數。若是選擇dynamic,則由下開參數決定:
pm.max_children #,子進程最大數
pm.start_servers #,啓動時的進程數
pm.min_spare_servers #,保證空閒進程數最小值,若是空閒進程小於此值,則建立新的子進程
pm.max_spare_servers #,保證空閒進程數最大值,若是空閒進程大於此值,此進行清理
pm.max_requests = 1000
#設置每一個子進程重生以前服務的請求數. 對於可能存在內存泄漏的第三方模塊來講是很是有用的. 若是設置爲 ’0′ 則一直接受請求. 等同於 PHP_FCGI_MAX_REQUESTS 環境變量. 默認值: 0.
關於php-fpm配置參考:
http://blog.csdn.net/unix21/article/details/8743246
和
php-fpm – 配置詳解(主要是針對pm幾個選項進行測試)
php-fpm源碼目錄:php-5.5.10\sapi\fpm
配置nginx支持PHP
nginx的配置文件nginx.conf在
# cd /usr/local/nginx/conf
nginx默認web文件夾在
/usr/local/nginx/html
若是須要nginx支持PHP須要修改nginx.conf,加入以下語句:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/www$fastcgi_script_name;
}
本機的web文件夾在/usr/www,須要修改fastcgi_param SCRIPT_FILENAME指向對應目錄便可:
因此
注意,若是pfp-fpm配置文件偵聽9001等端口,須要改對應文件:
# /usr/local/php/etc/php-fpm.conf
若是還須要解析/usr/www下的html文件,須要改配置
還有一點須要注意:php-fpm偵聽端口範圍9000-9999,nginx開啓端口800-900比較好。
重啓nginx
# /usr/local/nginx/sbin/nginx -s reload
測試頁面info.php
上傳至/usr/www目錄,成功運行
錯誤描述:
PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for '8.0/no DST' instead in C:\info.php on line 4
解決辦法:
打開php.ini 配置文件
找到
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
修改成:
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone =PRC 或者UTC
而後記得重啓Nginx!
另外,還有下面兩種辦法(不建議)
一、在頁頭使用date_default_timezone_set()設置 date_default_timezone_set('PRC'); //東八時區 echo date('Y-m-d H:i:s');
二、在頁頭使用 ini_set('date.timezone','Asia/Shanghai');
對於中國,可選值:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次爲重慶,上海,烏魯木齊)港臺地區可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次爲澳門,香港,臺北),還有新加坡:Asia/Singapore,老的PRC也行。
PHP所支持的時區列表可參見:http://www.php.net/manual/zh/timezones.php
===================================
開啓PHP的opcace
php.ini配置opcace
;opcache
zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/opcache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.enable=1
若是嫌這個不直觀能夠裝個PHP文件查看,地址在https://gist.github.com/ck-on/4959032,不過此網站目前國內沒法打開了。
把上面的代碼保存爲一個php文件放到你的網站目錄下面打開就能夠看到:
Opcache參考:
3.升級php
假設以前安裝過老版本的php例如php5.4.8,須要安裝最新的版本只要用以前的安裝步驟安裝最新的版本便可.
4.跟蹤Nginx和PHP
設置Nginx和PHP都是單子進程
修改nginx.conf
worker_processes 1;
修改php-fpm.conf
pm = static
pm.max_children = 1
#ps aux
strace/ltrace
strace或ltrace跟蹤均可以查看應用程序正在運行過程當中發起的系統函數調用和動態庫函數調用,兩者大同小異。
#strace
-p 進程id 經過進程號跟蹤指定進程
-o 文件名 跟蹤信息輸出到指定文件
-f 跟蹤其經過fork調用產生的子進程
-t 輸出每個系統調用的發起時間
-T 輸出每個系統調用的消耗時間
退出 Ctrl+C
1).Nginx master process
2).Nginx worker process
3) php-fpm master process
4) php-fpm pool
pstack
pstack查看系統調用和函數調用關係,能夠看到當前Nginx內部在執行什麼函數。
其實,pstack不過是gdb實現的一個shell腳本而已。
5.調試Nginx
因爲gdb須要gcc的時候加上-g參數,這樣生成的文件才能使用gdb調試,所以咱們要對源碼作一下小改動
ngx_compile_opt="-c"
變爲
ngx_compile_opt="-c -g"
./configure --prefix=/usr/local/nginx
另外一個值得關注的編譯選項是-O0,若是在gdb內打印變量時提示"<value optimized out>"或gdb提示顯示的當前正執行的代碼行與源碼匹配不上而讓人感受莫名其妙,那麼,這則多半是由於gcc的優化致使,咱們能夠加上-O0選項來強制禁用gcc的編譯優化。除了能夠經過編輯objs/Makefile文件,把這兩個選項直接加在CFLAGS變量裏之外,還有另外幾種方法也能夠達到一樣的效果。
1. 在進行configure配置時,按以下方式執行。
2. 在執行make時,按以下方式執行。
直接修改objs/Makefile文件和上面提到的第2種方法是在咱們已經執行configure以後進行的,若是以前已經執行過make,那麼還需刷新全部源文件的時間戳,以便從新編譯每個Nginx源文件。
修改nginx的conf配置文件爲單進程
查看宏定義
注意:Nginx中有大量的宏,若是不作特殊處理是看不到這些宏定義的:
必須編譯的時候使用ggdb3才能夠查看定義。
ngx_compile_opt="-c"
變爲
ngx_compile_opt="-c -ggdb3"
或者
#make CFLAGS="-ggdb3 -O0"
#info macro NGX_OK
#macro expand NGX_OK
查看ngx_core.h
啓動nginx
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#ps -efH | grep nginx
#gdb -p 進程id 或者(gdb) attach 進程id 同樣的
利用set args 命令就能夠修改發送給程序的參數,而使用show args 命令就能夠查看其缺省參數的列表。
(gdb) set args -c /usr/local/nginx/conf/nginx.conf
(gdb) show args
使用l(list)命令查看main 函數,這個main函數是在src/core/nginx.c裏面,是nginx的入口函數
(gdb) l #列出源文件,只列出10行,請使用l- 和 l 或者l +行號 或者 l +函數名 進行定位
(gdb) break 215 #在哪行打斷點, 能夠break main
break命令(能夠簡寫爲b)能夠用來在調試的程序中設置斷點,該命令有以下四種形式:
break line-number 使程序剛好在執行給定行以前中止。
break function-name 使程序剛好在進入指定的函數以前中止。
break line-or-function if conditio若是condition(條件)是真,程序到達指定行或函數時中止。
break routine-name 在指定例程的入口處設置斷點
若是該程序是由不少原文件構成的,你能夠在各個原文件中設置斷點,而不是在當前的原文件中設置
斷點,其方法以下:
(gdb) break filename:line-number
(gdb) break filename:function-name
要想設置一個條件斷點,能夠利用break if命令,以下所示:
(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100
從斷點繼續運行:countinue命令break命令(能夠簡寫爲b)能夠用來在調試的程序中設置斷點,該命令有以下四種形式:
break line-number 使程序剛好在執行給定行以前中止。
break function-name 使程序剛好在進入指定的函數以前中止。
break line-or-function if conditio若是condition(條件)是真,程序到達指定行或函數時中止。
break routine-name 在指定例程的入口處設置斷點
若是該程序是由不少原文件構成的,你能夠在各個原文件中設置斷點,而不是在當前的原文件中設置
斷點,其方法以下:
(gdb) break filename:line-number
(gdb) break filename:function-name
要想設置一個條件斷點,能夠利用break if命令,以下所示:
(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100
從斷點繼續運行:countinue命令
斷點能夠多個
(gdb) info break 列出全部斷點
刪除指定的某個斷點:
(gdb) delete breakpoint 1
該命令將會刪除編號爲1的斷點,若是不帶編號參數,將刪除全部的斷點
禁止使用某個斷點
(gdb) disable breakpoint 1
該命令將禁止斷點1,同時斷點信息的(Enb)域將變爲n
容許使用某個斷點
(gdb) enable breakpoint 1
該命令將容許斷點1,同時斷點信息的(Enb)域將變爲y
(gdb) continue 從斷點開始繼續執行直到下一個斷點
(gdb) r #run,從main函數開始從新運行程序,由於以前已經執行了,因此要想從main開始調試要r,這樣就會結束以前的進程
(gdb) l 列出代碼
(gdb) s 下一步,會列出當前所在的文件代碼行數
(gdb)finish 結束執行當前函數,顯示其返回值(若是有的話)
(gdb)bt 打印棧幀,能夠看出當前文件名以及函數
(gdb) p *ptr 打印指針內容
(gdb)info args
打印出當前函數的參數名及其值。
(gdb)info locals
打印出當前函數中全部局部變量及其值。
(gdb)info catch
打印出當前的函數中的異常處理信息。
查看數組
int *array = (int *) malloc (len * sizeof (int));
(gdb)p *array@len
@的左邊是數組的首地址的值,也就是變量array所指向的內容,右邊則是數據的長度,其保存在變量len中
(gdb)disp * 結構體變量 查看結構體信息
(gdb)p * 結構體變量 查看結構體信息
其實 print *a@5 指針對象均可以看到
查看內存
(gdb)x
forward-search <regexp>
search <regexp>
向前面搜索。
reverse-search <regexp>
查看void指針
ngx_http_init_connection(ngx_connection_t *c)
查看p *c
若是要直接查看data
p *c->data
提示Attempt to dereference a generic pointer.
由於空指針類型必須強制轉換!
查看代碼
因此強制轉換便可
空指針對象轉換技巧:
*(類型*)(空指針對象)
查看socket
# lsof -p 進程id
監控epoll FD
#ps aux|grep nginx
#sudo ls -alh /proc/Nginx的進程id/fd
使用tcpdump查看數據包
# tcpdump -i eth0 port 80
壓力測試
# ab -c l -n 10000 http://127.0.0.1/index.html
6.Nginx的URL重寫
1.形如 /xxx/abc這樣的 跳轉到 /aaa/下
location ~* ^/(.*)/abc {
#if (!-e $request_filename) {
rewrite ^/(.*)$ /aaa/ permanent;
break;
#}
}
標誌flag用於結束rewrite指令,它的可取值有:
last - 在搜索到相應的URI和location以後完成rewrite指令;
break - 完成 rewrite指令處理
redirect - 返回302臨時重定向,若是replacement替換部分是由http://開始,它將被應用。
permanent - 返回301代碼永久重定向
2.形如 /news這樣的
location ~* ^/(history|news) {
#if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/Home/$1 last;
break;
#}
}
3.形如 /shanghai而且以這個結尾的 $標識結束符
location ~* ^/(beijing|shanghai)$ {
#if (!-e $request_filename) {
rewrite (^/)(beijing|shanghai) /index.php/Home/Course/index?param1=$2 last;
break;
#}
}
7.Nginx虛擬主機
實際中須要多個域名綁定到同一臺服務器不一樣的網站,使用server_name便可
server {
listen 80;
server_name www.csdn.net;
若是是多個域名空格便可
server_name www.csdn.net bolg.csdn.net;
8.訪問權限
容許指定IP/Ip段 0/24
allow 192.168.1.222;
deny all;
屏蔽指定IP
deny 192.168.1.222;
9.開啓gzip壓縮
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
#gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
第1行:開啓Gzip
第2行:不壓縮臨界值,大於1K的才壓縮,通常不用改
第3行:buffer,就是,嗯,算了不解釋了,不用改
第4行:用了反向代理的話,末端通訊是HTTP/1.0,有需求的應該也不用看我這科普文了;有這句的話註釋了就好了,默認是HTTP/1.1
第5行:壓縮級別,1-10,數字越大壓縮的越好,時間也越長,看心情隨便改吧
第6行:進行壓縮的文件類型,缺啥補啥就好了,JavaScript有兩種寫法,最好都寫上吧,總有人抱怨js文件沒有壓縮,其實多寫一種格式就好了
第7行:跟Squid等緩存服務有關,on的話會在Header裏增長"Vary: Accept-Encoding",我不須要這玩意,本身對照狀況看着辦吧
第8行:IE6對Gzip不怎麼友好,不給它Gzip了
從新加載Nginx
/usr/local/nginx/sbin/nginx -s reload
用curl測試Gzip是否成功開啓
#curl -I -H "Accept-Encoding: gzip, deflate" "http://blog.csdn.net/unix"
把nginx升級到最新之後,發現用原來的配置啓動的時候會提示:
duplicate MIME type "text/html" in /usr/local/nginx/conf/nginx.conf:37
實際上,text/html根本就不須要寫的,gzip默認就會壓縮它的,只不過之前的nginx版本不提示這個警告而已,新版本的會出這個警告,因此解決辦法很簡單:把text/html從你的配置中刪除。
10.屏蔽指定的蜘蛛爬蟲
查詢最近的60條日誌
# tail -n 20 /usr/local/nginx/logs/access.log
發現大量的蜘蛛爬行日誌
能夠這樣屏蔽,加在nginx配置文件的server段
測試,例如咱們須要屏蔽YisouSpider,可是不能屏蔽Baiduspider
# curl -I -A 'YisouSpider' http://www.../
# curl -I -A 'Baiduspider' http://www.../
查指定時間段內的日誌
# sed -n '/19\/Feb\/2016:14:13:00/,/19\/Feb\/2016:14:16:59/'p /usr/local/nginx/logs/access.log>>500_20160219-1413-1416.txt
11.Nginx域名重寫
須要 blog.csdn.net跳轉到www.csdn.net
12.代理tomcat
全部到 http://blog.csdn.net:8080/unix21/a.jsp的均可以用http://blog.csdn.net/unix21/a.jsp 來訪問
13.使用tengine
http://tengine.taobao.org/index_cn.html
http://tengine.taobao.org/document_cn/http_trim_filter_cn.html
刪除 html , 內嵌 javascript 和 css 中的註釋以及重複的空白符。
http://tengine.taobao.org/document_cn/http_concat_cn.html
合併多個文件在一個響應報文中。
須要修改js和css的代碼
參數中某位置只包含一個‘?’,則'?'後表示文件的版本,例如:http://example.com/??style1.css,style2.css,foo/style3.css?v=102234