linux下nginx的安裝與配置

一、準備工作


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
  1. 安裝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
  2. 安裝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
  3. 安裝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.cnhttp://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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章