1. 下載忿墅、解壓Nginx
cd /usr/local/src
wget http://nginx.org/download /nginx-1.8.0.tar.gz
tar -zxvf nginx-1.8.0.tar.gz
2. 編譯安裝Nginx
cd /usr/local/src/nginx-1.8.1
配置編譯參數(shù)
./configure \
--prefix=/usr/local/nginx \
--with-http_realip_module \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre
配置解釋:
--prefix=/usr/local/nginx \
配置Nginx的安裝目錄
--with-http_realip_module \
允許ngx_http_realip_module模塊(mod_rpaf)
此模塊支持顯示真實來源IP地址陡鹃,主要用于NGINX做前端負(fù)載均衡服務(wù)器使用。
--with-http_sub_module \
允許ngx_http_sub_module模塊
這個模塊可以能夠在nginx的應(yīng)答中搜索并替換文本哮洽。
--with-http_gzip_static_module \
允許ngx_http_gzip_static_module模塊(mod_dflate)填渠。
這個模塊在一個預(yù)壓縮文件傳送到開啟Gzip壓縮的客戶端之前檢查是否已經(jīng)存在以“.gz”結(jié)尾的壓縮文件,這樣可以防止文件被重復(fù)壓縮。
--with-http_stub_status_module \
允許ngx_http_stub_status_module模塊(mod_status)
這個模塊可以取得一些nginx的運行狀態(tài)氛什,如果是工業(yè)狀況莺葫,可以直接取消。
編譯枪眉、安裝
make && make install
3. 啟動并檢測是否啟動成功
/usr/local/nginx/sbin/nginx
ps aux | grep nginx
4. 配置Ngix配置文件
vim /usr/local/nginx/conf/nginx.conf
找到
location = /50x.html {
root? html;
}
在下面加入以下內(nèi)容
location ~ \.php$ {
root html;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
上面這段配置的意思就是讓所有的PHP 腳本請求全部轉(zhuǎn)發(fā)到 FastCGI處理. 使用FastCGI默認(rèn)配置
5. 測試PHP解析
vim /usr/local/nginx/html/2.php
寫入以下內(nèi)容
<?php
echo "test php scripts.";
?>
測試解析php
curl localhost/2.php
這里有必要說一下我自己出現(xiàn)的錯誤
剛開始我解析出來的內(nèi)容如下:
就是原來的php文本捺檬,顯然解析失敗。
分析一:更改完nginx配置后贸铜,沒有重新加載
嘗試一:
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
再次curl localhost/2.php的時候堡纬,出現(xiàn)以下錯誤
分析二:可能是/usr/local/php/html文件夾的權(quán)限不夠,不能讀取html中的2.php文件
嘗試二:查看/usr/local/php/html的權(quán)限發(fā)現(xiàn)是755蒿秦,所以并不是權(quán)限的問題烤镐,但是還是嘗試了一下chmod 777 /usr/local/nginx/html,但是問題依舊棍鳖。
分析三:后來想到在配置php-fpm的時候配置的php-fpm和nginx之間應(yīng)該是socket通信炮叶,而且socket文件就應(yīng)該在/tmp/php-fcgi.sock,所以去查看/tmp但是發(fā)現(xiàn)并沒有此文件渡处,所以說php-fpm和nginx之間無法通信镜悉。懷疑/tmp的權(quán)限不夠,對php-fpm用戶的權(quán)限不夠医瘫,所以無法生成文件侣肄。
嘗試三:去查看/tmp的權(quán)限,發(fā)現(xiàn)是777醇份,此時我的心情是這樣的:
分析四:不甘心的又去看了下php-fpm的配置文件稼锅,往底下翻了翻終于是找到了問題,原來在我的配置底下僚纷,php-fpm是有自己的配置沒被注釋的(被大量的注釋迷昏了頭缰贝,以為所有的都被注釋了)。
嘗試四:將下面[www]下除了咱們添加的內(nèi)容的其他所有沒被注釋的部分全部注釋掉畔濒,重啟php-fpm剩晴,重新加載nginx的配置文件,再次解析侵状,還是解析失敗...
分析五:既然tmp下的socket文件是用來通信的赞弥,那么是不是用戶對這個文件的權(quán)限不夠呢?一看果不其然趣兄,php-fpm用戶對這個文件沒有寫的權(quán)限绽左,故不能通信。
嘗試五:給php-fcgi.sock增加寫的權(quán)限
chmod 777 /tmp/php-fcgi.sock
再次解析艇潭,成功F纯O访铩!
6. 編寫Nginx的啟動腳本鲁纠,并加入系統(tǒng)服務(wù)
vim /etc/init.d/nginx
加入以下內(nèi)容
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start() {
echo -n $"Starting $prog: "
mkdir -p /dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -TERM
rm -rf /dev/shm/nginx_temp
RETVAL=$?
echo
return $RETVAL
}
reload(){
echo -n $"Reloading $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -HUP
RETVAL=$?
echo
return $RETVAL
}
restart(){
stop
start
}
configtest(){
$NGINX_SBIN -c $NGINX_CONF -t
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
configtest)
configtest
;;
*)
echo $"Usage: $0 {start|stop|reload|restart|configtest}"
RETVAL=1
esac
exit $RETVAL
這個啟動腳本我真的無能為力啊总棵,沒學(xué)過shell編程...
賦予啟動文件權(quán)限755
chmod 755 /etc/init.d/nginx
7. Nginx服務(wù)開機啟動
chkconfig ?--add nginx
chkconfig nginx on
服務(wù)啟動、停止改含、重啟的方法:
service nginx start 或 /etc/init.d/nginx start
service nginx stop 或 /etc/init.d/nginx stop
service nginx restart 或 /etc/init.d/nginx restart
8. 更改nginx的配置情龄,配置虛擬主機
首先將原來的配置文件清空,但是我們最好先備份一下
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
> /usr/local/nginx/conf/nginx.conf
然后編輯文件并寫入以下內(nèi)容
vim /usr/local/nginx/cong/nginx.conf
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 6000;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 3526;
server_names_hash_max_size 4096;
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
'$host "$request_uri" $status'
'"$http_referer" "$http_user_agent"';
sendfile on;
tcp_nopush on;
keepalive_timeout 30;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 8 4k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
client_max_body_size 10m;
client_body_buffer_size 256k;
client_body_temp_path /usr/local/nginx/client_body_temp;
proxy_temp_path /usr/local/nginx/proxy_temp;
fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
fastcgi_intercept_errors on;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 5;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/htm application/xml;
server
{
listen 80;
server_name localhost;
index index.html index.htm index.php;
root /usr/local/nginx/html;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
}
}
include /usr/local/nginx/conf/vhosts/*.conf;
}
上面的配置主要就是開啟了其他的一些功能,但是最主要的還是最后一句捍壤,配置了虛擬主機的配置文件的位置骤视。
另外注意一點,這次給nginx指定了用戶和用戶組都是nobody
創(chuàng)建虛擬主機配置文件的目錄和文件
mkdir /usr/local/nginx/conf/vhosts
cd !$
vim default.conf
創(chuàng)建的是一個默認(rèn)虛擬主機鹃觉,所以配置文件中用default_server字段來標(biāo)識
配置文件如下:
server{
listen 80 default_server;
server_name www.liuke.com;
index index.html index.htm index.php;
root /tmp/tmp;
?deny all;
}
大致意思就是說要監(jiān)聽80端口专酗,而且是個默認(rèn)虛擬主機(也就是說無論什么域名只要指向到這臺機器都會訪問到這個虛擬主機)
但是配置文件的最后謝了一句deny all;代表禁止訪問,所以盗扇,不匹配域名的所有訪問都會被禁止
9. 更改php-fpm的配置
vim /usr/local/php/etc/php-fpm.pid
更改配置如下:
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
user = php-fpm
group = php-fpm
listen.owner = nobody //和后面的nginx的一致
listen.group = nobody //同上
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
其實和之前配置的差別就是指定了socket文件的監(jiān)聽用戶和監(jiān)聽用戶組都是nobody笼裳,這和之前我讓大家注意的地方(nginx新的配置文件中也增加了用戶和用戶組)是前后呼應(yīng)的,因為nginx和php-fpm要進行通信粱玲,所以要對socket文件具有讀寫權(quán),其他人對這個文件不能有任何其他的權(quán)限這才是安全的拜轨,所以我們讓nginx的用戶和用戶組都是noboody抽减,php-fpm對于socket文件的監(jiān)聽用戶也是nobody,這樣就保證了socket文件的可讀寫性和系統(tǒng)的安全性
但是我有個疑問:為什么不直接讓php-fpm的用戶和用戶組直接也是nobody呢橄碾,這樣就不用費事的去為php-fpm專門建立一個用戶卵沉,為socket文件的監(jiān)聽者指定用戶了?法牲?史汗?
重啟php-fpm服務(wù)
service php-fpm restart
然后我們可以看到的是,/tmp/php-fcgi.sock文件的所有者就變成了nobody拒垃,用戶和用戶組擁有讀寫權(quán)停撞,其他權(quán)限都沒有
10. 測試php解析
curl localhost/2.php
錯誤集錦:
問題1:
error: the HTTP rewrite module requires the PCRE library.
yum install -y pcre-devel
問題2:
出現(xiàn)端口占用的情況,剛有個同學(xué)問我端口沖突了,nginx啟動不了,其實很簡單通熄,這是因為以前你安裝過Apache耕腾,Apache監(jiān)聽的也是80端口,所以會沖突悴了。
把httpd進程給殺了就行,也能去改端口號,但是太麻煩了道宅。不過剛才我殺進程的時候竟然殺不死食听。。污茵。
干脆把httpd的開機自啟關(guān)了
chkconfig httpd off
然后重啟就可以解決了樱报。