編碼的世界 / 優質文選 / 文明

Linux環境Nginx安裝與調試以及PHP安裝


2021年7月05日
-   

linux版本:64位CentOS 6.4
Nginx版本:nginx1.8.0
php版本:php5.5.28
 
1.編譯安裝Nginx官網:http://wiki.nginx.org/Install
下載
# wget http://nginx.org/download/nginx-1.8.0.tar.gz
# tar -zvxf nginx-1.8.0.tar.gz
# cd ./nginx-1.8.0
# ./configure prefix=/usr/local/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 functionsfrom OpenSSL library. You can either disable the module by usingwithout-http-cache option, or install the OpenSSL library into the system,or build the OpenSSL library statically from the source with nginx by usingwith-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
 
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-fpmenable-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配置參考:http://blog.csdn.net/unix21/article/details/8743246 
php-fpm源碼目錄:php-5.5.10sapifpm
配置nginx支持PHPnginx的配置文件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/local/nginx/html$fastcgi_script_name;
}
本機的web文件夾在/usr/www,需要修改fastcgi_param SCRIPT_FILENAME指向對應目錄即可:
所以
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;
}

 
注意這樣只能解析php,不能解析/usr/www下的html文件,是因為需要改配置
 location / {
#root html;
root /usr/www;
index index.html index.htm;
}

 
重啟nginx# /usr/local/nginx/sbin/nginx -s reload
測試頁面info.php
<?php
phpinfo();
?>

上傳至/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! 另外,還有下面兩種辦法(不建議) 1、在頁頭使用date_default_timezone_set()設置 date_default_timezone_set('PRC'); //東八時區 echo date('Y-m-d H:i:s'); 2、在頁頭使用 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的opcacephp.ini配置opcace
;opcachezend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/opcache.soopcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=4000opcache.revalidate_freq=60opcache.fast_shutdown=1opcache.enable_cli=1opcache.enable=1
 
如果嫌這個不直觀可以裝個PHP文件查看,地址在https://gist.github.com/ck-on/4959032,
把上面的代碼保存為一個php文件放到你的網站目錄下面打開就可以看到:
Opcache參考:
新一代 PHP 加速插件 Zend Opcache 
Linux平滑編譯升級php至5.5.0
 
3.升級php假設之前安裝過老版本的php例如php5.4.8,需要安裝最新的版本只要用之前的安裝步驟安裝最新的版本即可.
 
4.跟蹤Nginx和PHP設置Nginx和PHP都是單子進程
修改nginx.confworker_processes  1;
修改php-fpm.confpm = static
pm.max_children = 1
#ps aux
 
strace/ltracestrace或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

 
pstackpstack查看系統調用和函數調用關系,可以看到當前Nginx內部在執行什麼函數。
其實,pstack不過是gdb實現的一個shell腳本而已。
 
 
5.調試Nginx 
由於gdb需要gcc的時候加上-g參數,這樣生成的文件才能使用gdb調試,因此我們要對源碼做一下小改動

修改auto/cc/conf文件


ngx_compile_opt="-c"
變為
ngx_compile_opt="-c -g"

執行configure


./configure prefix=/usr/local/nginx
 
另一個值得關注的編譯選項是-O0,如果在gdb內打印變量時提示"<value optimized out>"或gdb提示顯示的當前正執行的代碼行與源碼匹配不上而讓人感覺莫名其妙,那麼,這則多半是因為gcc的優化導致,我們可以加上-O0選項來強制禁用gcc的編譯優化。除了可以通過編輯objs/Makefile文件,把這兩個選項直接加在CFLAGS變量裏以外,還有另外幾種方法也可以達到同樣的效果。
1. 在進行configure配置時,按如下方式執行。

[root@localhost nginx-1.2.0]# CFLAGS="-g -O0" ./configure prefix=/usr/local/nginx

2. 在執行make時,按如下方式執行。

[root@localhost nginx-1.2.0]# make CFLAGS="-g -O0" 

直接修改objs/Makefile文件和上面提到的第2種方法是在我們已經執行configure之後進行的,如果之前已經執行過make,那麼還需刷新所有源文件的時間戳,以便重新編譯每一個Nginx源文件。
 
修改nginx的conf配置文件為單進程
worker_processes 1;
daemon off;
master_process off;

 
查看宏定義注意:Nginx中有大量的宏,如果不做特殊處理是看不到這些宏定義的:
 
必須編譯的時候使用ggdb3才可以查看定義。

修改auto/cc/conf文件


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.
因為空指針類型必須強制轉換!
查看代碼
ngx_http_connection_t *hc;
c->data = hc;

所以強制轉換即可
空指針對象轉換技巧:
*(類型*)(空指針對象)
 
 
查看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
參考文獻
nginx模塊_使用gdb調試nginx源碼 
綁定Nginx到gdb 
Nginx模塊開發入門 
gdb調試nginx的helloworld 
gdb中查看數組各項的值
gdb查看運行時數據
GDB 格式化結構體輸出  GDB使用總結

熱門文章