一、準備工作
nginx可以使用各平臺的默認包來安裝,本文是介紹使用源碼編譯安裝,包括具體的編譯參數信息。
正式開始前,編譯環境gcc g++ 開發庫之類的需要提前裝好,這裏默認你已經裝好。
ububtu平臺編譯環境可以使用以下指令:
apt-get install build-essential
apt-get install libtool
centos平臺編譯環境使用如下指令:
安裝make:
yum -y install gcc automake autoconf libtool make
安裝g++:
yum install gcc gcc-c++
二、安裝依賴插件
一般我們都需要先裝pcre, zlib,前者爲了重寫rewrite,後者爲了gzip壓縮。
選定源碼目錄,可以是任何目錄,本文選定的是/usr/local/src
cd /usr/local/src
安裝PCRE庫
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下載最新的 PCRE 源碼包,使用下面命令下載編譯和安裝 PCRE 包:
cd /usr/local/src wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz tar -zxvf pcre-8.38.tar.gz cd pcre-8.38 ./configure make make install
安裝zlib庫
到http://zlib.net/zlib-1.2.8.tar.gz 下載最新的 zlib 源碼包,使用下面命令下載編譯和安裝 zlib包:
cd /usr/local/src wget http://zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure make make install
安裝ssl(某些vps默認沒裝ssl)
cd /usr/local/src wget https://www.openssl.org/source/openssl-1.0.1t.tar.gz tar -zxvf openssl-1.0.1t.tar.gz
三、安裝nginx
Nginx 一般有兩個版本,分別是穩定版和開發版,您可以根據您的目的來選擇這兩個版本的其中一個,本教程採用的爲版本爲1.8.1。下面是把 Nginx 安裝到 /usr/local/nginx 目錄下的詳細步驟:
cd /usr/local/src
wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar -zxvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./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=/usr/local/src/pcre-8.38
--with-zlib=/usr/local/src/zlib-1.2.11
--with-openssl=/usr/local/src/openssl-1.0.1t
make
make install
–with-pcre=/usr/src/pcre-8.38 指的是pcre-8.38 的源碼路徑。
–with-zlib=/usr/src/zlib-1.2.11 指的是zlib-1.2.11 的源碼路徑。
此處爲了便於閱讀進行了換行,實際操作時可把./configure後的配置寫在一行。
安裝成功後 /usr/local/nginx 目錄下如下
fastcgi.conf koi-win nginx.conf.default
fastcgi.conf.default logs scgi_params
fastcgi_params mime.types scgi_params.default
fastcgi_params.default mime.types.default uwsgi_params
html nginx uwsgi_params.default
koi-utf nginx.conf win-utf
啓動nginx
確保系統的 80 端口沒被其他程序佔用,運行/usr/local/nginx/nginx 命令來啓動 Nginx
netstat -ano|grep 80
如果查不到結果後執行,有結果則忽略此步驟(ubuntu下必須用sudo啓動,不然只能在前臺運行)
sudo /usr/local/nginx/nginx
打開瀏覽器訪問此機器的 IP,如果瀏覽器出現 Welcome to nginx! 則表示 Nginx 已經安裝並運行成功。
關閉nginx
ps -ef|grep nginx
kill -QUIT [nginx的線程id]
到這裏nginx就安裝完成了。
四、設置nginx開機自啓
首先,在linux系統的/etc/init.d/目錄下創建nginx文件,使用如下命令:
vim /etc/init.d/nginx
在腳本中添加如下命令:
#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
# It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/nginx
nginx_config=/usr/local/nginx/nginx.conf
nginx_pid=/usr/local/nginx/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
}
# Stop nginx daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx $nginx_pid
}
# reload nginx service functions.
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL
需要根據您的安裝路徑修改下面這三項配置:
nginxd=/usr/local/nginx/nginx
nginx_config=/usr/local/nginx/nginx.conf
nginx_pid=/usr/local/nginx/nginx.pid
保存腳本文件後設置文件的執行權限:
chmod a+x /etc/init.d/nginx
然後,就可以通過該腳本對nginx服務進行管理了:
/etc/init.d/nginx start
/etc/init.d/nginx stop
使用chkconfig進行管理
上面的方法完成了用腳本管理nginx服務的功能,但是還是不太方便,比如要設置nginx開機啓動等。這時可以使用chkconfig來設置。
先將nginx服務加入chkconfig管理列表:
chkconfig --add /etc/init.d/nginx
加完這個之後,就可以使用service對nginx進行啓動,重啓等操作了。
service nginx start
service nginx stop
設置終端模式開機啓動:
chkconfig nginx on
至此,nginx開機自啓動設置完成。
五、配置nginx
安裝完成後nginx的主配置文件被放在/usr/local/nginx/nginx.conf,同時一個默認的備份配置文件存在/usr/local/nginx/nginx.conf.default。其它子配置文件同樣有一個.default結尾的備份配置文件。.default的作用是當你修改配置文件錯誤的時候,你可以快速回到上一個好用的狀態。建議大家經常對配置好的功能的配置文件做備份,可以以日期文件做結尾。比如你可以使用如下指令完成,修改日期爲你所備份的日期。每次修改完後都需要重新加載配置文件。
全局配置
我們分片段一點點的介紹默認的配置文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
這些是配置文件開始的默認行。通常的環境下,你不需要修改這些選項。這一部分有幾個方面需要我們注意:
- 所有以#號開的行是註釋,nginx不會解析。默認的配置文件有許多說明解釋的註釋塊
- 指令是以一個變量名開頭(例如,worker_processes或pid),然後包含一個參數(例如,1或
logs/nginx.pid)或者多個參數(例如,”logs/error.log notice”) - 所有指令以分號結尾
- 某些指令,像上面的events可以包含多個子指令作爲參數。這些子指令以花括號包圍。
- 雖然nginx不解析空白符(例如tab,空格,和換行符),但是良好的縮進能提高你維護長期運行配置文件的效率。良好的縮進使配置文件讀起來更流暢,能讓你很容易明白配置的策略,即使幾個月前。
下面我們繼續讀配置文件
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
“http { }”塊的開頭像配置文件的開頭一樣都是標準配置不需要修改。這裏我們需要把注意力放在這些元素上:
- 這部分內容的開始”include”語句包含/usr/loca/nginx/mime.types文件到nginx.conf文件include語句所在位置。include對ningx.conf文件的可讀性和組織性很有用。
- 不能過多使用include,如果太多遞歸地include文件會產生混亂,所以需要合理有限制地使用include來保證配置文件的清晰和可管理。
- 你可以去掉log_format指令前的註釋並修改這幾行設置的變量爲你想記錄的信息。
- gzip指令告訴nginx使用gzip壓縮的方式來降低帶寬使用和加快傳輸速度。如果想使用gzip壓縮,需要添加如下配置到配置文件的gzip位置。
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain text/html text/css
application/x-javascript text/xml
application/xml application/xml+rss
text/javascript;
使用gizp壓縮並不是沒有代價的。在降低帶寬的同時也增加了CPU的使用。gzip_cop_level的參數取值範圍1-9,9代表最用CPU和1代表最少用CPU,其默認值是1.
另外,請注意上面的片段 “http { ” 是http的前半部分,其餘部分解下面繼續,直到匹配的”}”。
虛擬機server配置
server {
listen 80;
server_name localhost;
access_log logs/localhost.access.log main;
location / {
root html;
index index.html index.htm;
}
}
}
我們可以看到http{ }塊到此結束。
server指令塊,像上面例子中那個一樣,是我們nginx用戶主要配置自己虛擬主機的地方。在server塊裏有許多重要的指令。listen指令告訴nginx在一個特定的hostname,ip或者tcp端口監聽連接。默認,http服務運行在80端口。一下這些listen指令都是有效的:
listen 127.0.0.1:80;
listen localhost:80;
listen 127.0.0.1:8080;
listen localhost:8080;
listen 192.168.3.105:80;
listen 192.168.3.105:8080;
listen 80;
listen *:80;
listen 8080;
listen *:8080;
listen 12.34.56.77:80;
listen 12.34.56.78:80;
listen 12.34.56.79:80;
在這些例子中,我們可以看到很多不同表達方式:
- 第一組2個指令指明服務器監聽在127.0.0.1或localhost的80端口,localhost通常定義在/etc/hosts指向127.0.0.1
- 第二組除了端口號監聽在8080而不是80外,與第一組相同。
- 第三組例子定義服務器監聽在192.168.3.105的80和8080端口
- 第四組例子是在所有地址上監聽特定的端口。listen 80與listen *:80相同,listen 8080與listen
*:80相同。 - 最後一組例子設置服務器只監聽在12.34.56.77/78/79的80端口上的請求。
server_name指令可以設置基於域名的虛擬主機,根據請求頭部的內容,一個ip的服務器可以配置多個域名。下面這些server_name的參數是有效的:
server_name nginx.cn;
server_name nginx.cn www.nginx.cn;
server_name *.nginx.cn;
server_name .nginx.cn;
server_name nginx.*;
server_name nginx.cng bucknell.net brackley.org;
server_name localhost litchfield bleddington;
server_name "";
多個域名之間以空格分隔。nginx允許一個虛擬主機有一個或多個名字,也可以使用通配符”*”來設置虛擬主機的名字。上面的例子我們看到了很多特殊的地方:
- 第一組例子,首先定義server_name爲nginx.cn,那麼來自http://nginx.cn的請求就會發到該主機上。第二個例子配置了nginx.cn和www.nginx.cn,那麼http://nginx.cn和http://www.nginx.cn的請求會發到這個主機上。
- *.nginx.cn和.nginx.cn是等同的配置,設置該主機處理所有來自nginx.cn的子域名,比如www.nginx.cn,blog.nginx.cn等
- 第二組server_name配置nginx.*,配置服務器處理所有以nginx.開頭的請求。例如,nginx.com,nginx.cn,nginx.net,nginx.baidu.com
- 接下來一組第一個server_name配置,設置主機處理來自三個域名的請求。nginx允許設置不是有效域名的名字。比如接下來這個配置我們可以看到三個不是有效域名的例子,localhost,litchfiled和bledington。nginx只查找請求的HTTP頭中的域名但並不判斷域名是否有效,這個例子中這些主機名可以配製在/etc/hosts中。當你在本機調試時使用非域名的主機名有時候更適合些。
- 最後一組例子,server_name設置爲空的雙引號,它告訴nginx捕捉所有沒有hostname的請求,或者hostname沒有在其它server_name中指定的。
我們繼續分析接下來的server指令塊,看看access_log指令。
access_log logs/nginx.access.log;
access_log /srv/http/ducklington.org/logs/access.log;
access_log /var/log/nginx/access/ducklington.org;
access_log off;
第一個例子,日誌使用相對路徑,log文件放在與配置文件同級的目錄中,也就是日誌存儲在/usr/local/nginx/logs/nginx.access.log;接下來的兩個例子定義了完整的絕對路徑;最後一個例子是關閉access log,不會記錄訪問日誌到文件。
server塊的最後部分是location指令塊,對於client的不同請求目標,location是用來配置服務器的不同響應。
就像server_name指令配置nginx處理請求使用包含在請求中的信息一樣,location指令配置如何響應不同位置資源的請求。例如:
location / { }
location /images/ { }
location /blog/ { }
location /planet/ { }
location /planet/blog/ { }
location ~ IndexPage.php$ { }
location ~ ^/BlogPlanet(/|/index.php)$ { }
location ~* .(pl|cgi|perl|prl)$ { }
location ~* .(md|mdwn|txt|mkdn)$ { }
location ^~ /images/IndexPage/ { }
location ^~ /blog/BlogPlanet/ { }
location = / { }
前五個例子是按字面逐字匹配,匹配請求url域名後面開始的部分。假設一個請求http://www.nginx.cn,我們假設server_name已經匹配www.nginx.cn,那麼”location /”指令將捕獲這個請求。nginx使用匹配度最高的location。比如http://ducklington.org/planet/blog/和http://ducklington.org/planet/blog/about/會匹配”location /planet/blog”,而不是”location /planet/”。
location配置
對於特定的請求,一旦nginx匹配一個location來處理。那麼這個請求的響應內容就會由這個location塊中的指令決定。我們先來看一個最基本的locaiton配置塊。
location / {
root html;
index index.html index.htm;
}
在這個例子中文檔根(doucument root)位於html/目錄。根據nginx的安裝目錄/usr/local/nginx,這個location的完整路徑是/usr/local/nginx/html。假設一個請求訪問位於/blog/includes/styles.css文件同時沒有別的location塊匹配,那麼nginx會用位於文件系統的/usr/local/nginx/html/blog/includes/styles.css響應。當然你也可以用絕對路徑設置root指令。
index指令會告訴nginx使用哪個資源如果請求中沒有文件名。因此,如果請求http://.ducklington.org/將會補全資源位置爲/usr/local/nginx/html/index.html。如果index配置了多個文件,nginx會按順序處理直到找到第一個存在的補全資源。如果index.html在相關目錄中沒有,那麼將使用index.htm。如果兩個都不存在,會返回404錯誤。
附:Nginx配置proxy_pass轉發的/路徑問題
在nginx中配置proxy_pass代理轉發時,如果在proxy_pass後面的url加/,表示絕對根路徑;如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走。
假設下面兩種情況分別用 http://192.168.1.1/proxy/test.html 進行訪問。
第一種:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html
第二種(相對於第一種,最後少一個 / )
location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html