編譯安裝Nginx基於虛擬主機、端口,Openssl

    

What is Nginx?


    Nginx與Apach類似,是一款高性能的HTTP和反向代理服務器軟件,由俄羅斯程序員 lgor Sysoev開發,可以運行在 UNIX、GNU\LINUX、BSD、Mac OS X、Solaris及Microsoft Windwos等操作系統中;




What 使用 Nginx?


    Nginx和Apache一樣,都是HTTP服務器軟件,在功能實現上都採用模塊化結構設計,都支持通用語言接口,如PHP、Perl、Python等,同時還支持正向和反向代理、虛擬主機URL重寫、壓縮傳輸、SSL 加密傳輸等,它們之間最大差別是Apache所有模塊都支持動、靜態編譯,而Nginx模塊都是靜態編譯的,同時 Apache對Fcgi支持不太好,而Nginx對Fcgi支持非常好,在處理連接方式上,Nginx支持epoll,而Apache卻不支持,在空間使用上,Nginx安裝包僅有幾百K,與Nginx比起來,Apache顯得非常龐大;




Nginx模塊與工作原理:


    Nginx由內核與模塊組成,內核的設計非常微小簡潔,完成的工作非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個 location block (location 是Nginx配置中的一個指令,用於URL匹配),location中所配置的每個指令將會啓動不同的模塊完成相應的工作;


    Nginx模塊從結構上分爲核心模塊、基礎模塊和第三方模塊,HTTP模塊、EVENT模塊和MAIL模塊等屬於核心模塊,HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite屬於基礎模塊,其它任何用戶根據自己需要開發的模塊都屬於第三方模塊,Nginx有着衆多的模塊,所以變得特別強大;


Nginx模塊從功能上分爲三類:


    Handlers(處理器模塊)此類模塊直接處理請求,並進行輸出內容和修改headers信息等操作,Handlers處理模塊一般只能有一個;


    Filter(過濾器模塊)此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由Nginx輸出

    

    Proxies(代理類模塊)此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務比如FastCGI等進行交互,實現服務代理和負載均衡等功能;


Nginx分爲單工作進程和多工作進程兩種模式:

        單工作進程模式下,除主進程外,還有一個工作進程,工作進程是單線程的;

        多工作進程模式下,每個工作進程包含多個線程,Nginx默認爲單工作進程模式;


    Nginx的模塊直接被編譯進Nginx,因此屬於靜態編譯方式,啓動Nginx後,Nginx的模塊被自動加載,不像Apache,首先將模塊編譯爲一個so文件,然後在配置文件中指定是否加載;




Nginx官方站點:http://nginx.org/

        Nginx分爲三個版本:穩定版、開發版與歷史穩定版;

            次版本號爲偶數即爲穩定版,奇數爲開發版,穩定版都是經過了生產環境的嚴格測試,因此建議生產環境中,選擇次版本號爲偶數的穩定版;

           

        # 目前最新版本爲 Nginx 1.7.9;

        # 此處以1.6.2爲示例,進行編譯:


Nginx 6.2官方下載鏈接:

    http://nginx.org/download/nginx-1.6.2.tar.gz



    Nginx安裝過程非常簡單,默認情況下,編譯安裝Nginx包含了大部分可用模塊,可通過"./configure --help" 選項查看 Nginx編譯時可以接受的選項,例如不需要 http_ssi模塊,可通過 "--without-http_ssi_module" 方式關閉,同理如果需要  "http_perl"模塊,可通過  "--with-http_perl_module"方式進行安裝;


tar  zvf  nginx-1.6.2.tar.gz
cd  nginx-1.6.2
./configure  --prefix=/usr/local/nginx  --conf-path=/etc/nginx/nginx.conf  --user=nginx   --group=nginx   --error-log-path=/var/log/nginx/error.log   --http-log-path=/var/log/nginx/access.log   --pid-path=/var/run/nginx/nginx.pid   --lock-path=/var/lock/nginx.lock   --with-http_ssl_module   --with-http_stub_status_module   --with-http_gzip_static_module   --with-http_flv_module   --with-http_mp4_module   --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

make

make install


編譯三部曲:

1、configure命令是用來檢測你的安裝平臺的目標特徵的。它定義了系統的各個方面,包括nginx的被允許使用的連接處理的方法,比如它會檢測你是不是有CC或GCC,並不是需要CC或GCC,它是個shell腳本,執行結束時,它會創建一個Makefile文件。nginx的configure命令支持以下參數:

2、make用來編譯,它從Makefile中讀取指令,然後編譯。

3、make install用來安裝編譯後的程序,它從Makefile中讀取指令,並安裝到指定的位置。


--prefix=path     # 指定Nginx 安裝位置,默認使用 /usr/local/nginx。

--sbin-path=path  # 設置 nginx可執行文件路徑,默認爲 prefix/sbin/nginx。

--conf-path=path  # 指定Nginx 配置文件存放路徑,nginx允許使用不同的配置文件啓動,通過 nginx -c選項,默認配置文件位置爲  prefix/conf/nginx.conf;

--pid-path=path/name.pid   # 設置 nginx.pid文件位置,安裝完成後可在nginx.conf配置文件中更改位置,默認位置爲  prefix/logs/nginx.pid;

--error-log-path=path/name.log # 設置錯誤日誌位置及名稱,安裝完成後可在nginx.conf配置文件中更改位置,默認位置爲  prefix/logs/error.log;

--http-log-path=path/name.log  # http訪問日誌路徑,安裝後可在nginx.conf配置文件中更改位置,默認位置爲 prefix/logs/access.log;

--user=name                   # 設置 nginx工作進程的用戶,安裝完成後可在Nginx.conf配置文件中用user指令更改,默認用戶爲 nobody;

--group=name                 # 設置nginx工作進程的用戶組,安裝後可在Nginx.conf配置文件中用user 指令更改;

--lock-path=path/name.lock   # 指定鎖文件位置

--with-http_ssl_module      # 支持https協議,默認不會編被編譯,編譯時需要安裝 openssl-devel

--with-http_stub_status_module  # http狀態模塊,默認不會被編譯,可通過網頁輸出http狀態

--with-http_gzip_static_module  # 啓用 gzip 模塊用於網頁在傳輸時壓縮

--with-http_flv_module          # 啓用 flv 流媒體模塊

--with-http_mp4_module          # 啓用 httpd_mp4  mp4格式流媒體模塊

--http-client-body-temp-path=   # body 的臨時存放路徑

--http-proxy-temp-path=         # proxy 臨時存放路徑

--http-fastcgi-temp-path=       # fsstcgi 臨時存放路徑




Nginx命令:    

    /usr/local/sbin/nginx   啓動Nginx服務

    /usr/local/sbin/nginx -t  測試配置文件語法

    /usr/local/sbin/gginx -t -c /path/some  Nginx支持使用不同的配置文件啓動 -c 指定不同的配置文件

    /usr/local/sbin/nginx -v  查看 Nginx 版本

    /usr/local/sbin/nginx -V  顯示Nginx版本與編譯時都用了哪些額外選項


Nginx對進程的控制能力非常強大,可通過信號指令控制進程:

    常用的信號 :

        HUP:表示重新加載配置,也就是關閉原有進程,並開啓新的進程;此操作不會中斷用戶的訪問請求,因此可以用此信號平滑重啓Nginx;

        USR1:用於Nginx日誌切換,重新打開一個日誌文件,例如每天要生成一個新日誌文件時,可用這個信號來控制;

        USR2:用於平滑升級可執行程序

        QUIT:處理完所有請求以後,關閉該進程


獲取Nginx PID 方法:

    

ps -ef |grep "nginx:master process" |grep -v "grep" | awk -F' ' '{print $2} # 獲取Nginx所有進程的PID;

    

cat  /usr/local/logs/nginx.pid   # 如果編譯安裝時沒有指定Pid參數,默認在nginx程序所在目錄/logs/nginx.pid

    

    例:       

kill  -HUP  `cat /usr/local/nginx/logs/nginx.pid`  # 此處使用了命令引用,先獲取pid,在向kill 向 nginx進程傳遞 HUP 信號;




基於虛擬主機配置Nginx:

   

 vim /etc/nginx/nginx.conf
    
        server {
                listen 172.16.4.33:80;
                server_name www.nginx.com;
                root /www;
        location /www {
                index index.html index.htm;
                }
        }
        
        server {
                listen 172.16.4.33:80;
                server_name www.domain.com;
                root /qqq
        location /qqq {
                index  index.html index.htm;
                }
        }

準備主頁文件:

    mkdir /www  /qqq
    echo "Welcome to nginx. >  /www/index.html
    echo "Welcome to domian. > /qqq/index.html


啓動Nginx:

    /usr/local/nginx/sbin/nginx

       # 此時即定義了兩個虛擬主機,關於配置文件含義在另一篇博客中有詳解,此處就不在做介紹;



測試方法:

    做一臺DNS服務器,建立一條兩條A記錄,分別指向這兩臺虛擬主機,或直接修改客戶端的hosts文件,將這兩個域名與IP的對應關係寫在其中即可;

    wKiom1SgEw3huGESAAG9bm9uOLs444.jpg


wKioL1SgE-CTzhVuAABXICvJA7U695.jpg

wKioL1SgE-Dh8eDDAABh0ZpfcNg703.jpg

 

OK,兩個虛擬主機都測試成功;



基於端口:


    

vim /etc/nginx/nginx.conf
    
        server {
                listen 172.16.4.33:888;
                server_name www.nginx.com;
                root /www;
        location /www {
                index index.html index.htm;
                }
        }
        
        server {
                listen 172.16.4.33:999;
                server_name www.nginx.com;
                root /qqq
        location /qqq {
                index  index.html index.htm;
                }
        }

wKiom1SgFFmw18vNAAC1k2vXggo559.jpg

    此時在用瀏覽器加上端口訪問即可;



基於Openssl 服務實現 https:

    環境,CA及與Nginx在同一臺機器上; 


1、爲CA生成自簽證書:

    cd /etc/pki/CA
    (umask 077;openssl genrsa -out private/cakey.pem 2048)
[root@bogon CA]# openssl req -new -x509 -key private/cakey.pem -days 3655 -out cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:example.com
Email Address []:[email protected]

[root@bogon CA]# touch {index.txt,serial}
[root@bogon CA]# echo 01 > serial

      

2、爲Nginx生成私鑰,並申請證書:

  

  cd /etc/nginx/
    (umask 077;openssl genrsa -out nginx.key 2048)
[root@bogon nginx]# openssl req -new -key nginx.key -out nginx.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:nginx.com
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


3、簽署證書:

  [root@bogon nginx]# openssl ca -in nginx.csr -out nginx.crt -days 365


4、更改Nginx配置文件,支持https:(默認Nginx的SSL配置文件是註釋的,啓用起來即可)

    

server {
        listen       443 ssl;
        server_name  www.nginx.com;
        ssl_certificate      nginx.crt;
        ssl_certificate_key  nginx.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            root   /www;
            index  index.html index.htm;
        }
    }
killall nginx
/usr/local/nginx/sbin/nginx

wKioL1SgHsXRmWkEAADHkFvIjnA697.jpg


5、導出CA證書到客戶機:

    將剛剛爲CA自籤的證書cacert.pem 倒出到客戶機,並重命名爲 cacert.crt,雙擊倒入到受信任的根證書頒發機構:

        wKiom1SgHl2TAtvjAACBsxTf_io968.jpg

    

6、驗證https工作是否正常:

    wKioL1SgHzjjTlcjAAF1MvELKu8310.jpg



OK,Nginx服務啓用https功能,到此處即完成,後綴還會發布Nginx反向代理,筆者水平有限,如有疏漏不妥之處,還請不吝賜教!

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