Nginx 之一:編譯安裝nginx 1.8.1 及配置

一:基介紹html

官網地址www.nginx.org,nginx是由1994年畢業於俄羅斯國立莫斯科鮑曼科技大學的同窗爲俄羅斯rambler.ru公司開發的,開發工做最先從2002年開始,第一次公開發布時間是2004年10月4日,版本號是0.1.0java

 Nginx是單進程單線程模型,即啓動的工做進程只有一個進程響應客戶端請求,不像apache能夠在一個進程內啓動多個線程響應可請求,所以在內存佔用上比apache小的不少。Nginx維持一萬個非活動會話只要2.5M內存。Nginx和Mysql是CPU密集型的,就是對CPU的佔用比較大,默認session在本地文件保存,支持將session保存在memcache,可是memcache默認支持最大1M的課hash對象。mysql

nginx的版本分爲開發版、穩定版和過時版,nginx以功能豐富著稱,它便可以做爲http服務器,也能夠做爲反向代理服務器或者郵件服務器,可以快速的響應靜態網頁的請求,支持FastCGI/SSL/Virtual Host/URL Rwrite/Gzip/HTTP Basic Auth等功能,而且支持第三方的功能擴展。linux

nginx安裝可使用yum或源碼安裝,推薦使用源碼,一是yum的版本比較舊,二是使用源碼能夠自定義功能,方便業務的上的使用,源碼安裝須要提早準備標準的編譯器,GCC的全稱是(GNU Compiler collection),其有GNU開發,並以GPL即LGPL許可,是自由的類UNIX即蘋果電腦Mac OS X操做系統的標準編譯器,由於GCC本來只能處理C語言,因此原名爲GNU C語言編譯器,後來獲得快速發展,能夠處理C++,Fortran,pascal,objective-C,java以及Ada等其餘語言,此外還須要Automake工具,以完成自動建立Makefile的工做,Nginx的一些模塊須要依賴第三方庫,好比pcre(支持rewrite),zlib(支持gzip模塊)和openssl(支持ssl模塊)nginx

二:安裝c++

一、環境準備:先安裝準備環境web

yum install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel 正則表達式

複製代碼
  gcc爲GNU Compiler Collection的縮寫,能夠編譯C和C++源代碼等,它是GNU開發的C和C++以及其餘不少種語言 的編譯器(最先的時候只能編譯C,後來很快進化成一個編譯多種語言的集合,如Fortran、Pascal、Objective-C、Java、Ada、 Go等。)
  gcc 在編譯C++源代碼的階段,只能編譯 C++ 源文件,而不能自動和 C++ 程序使用的庫連接(編譯過程分爲編譯、連接兩個階段,注意不要和可執行文件這個概念搞混,相對可執行文件來講有三個重要的概念:編譯(compile)、連接(link)、加載(load)。源程序文件被編譯成目標文件,多個目標文件連同庫被連接成一個最終的可執行文件,可執行文件被加載到內存中運行)。所以,一般使用 g++ 命令來完成 C++ 程序的編譯和鏈接,該程序會自動調用 gcc 實現編譯。
  gcc-c++也能編譯C源代碼,只不過把會把它當成C++源代碼,後綴爲.c的,gcc把它看成是C程序,而g++看成是c++程序;後綴爲.cpp的,二者都會認爲是c++程序,注意,雖然c++是c的超集,可是二者對語法的要求是有區別的。
  automake是一個從Makefile.am文件自動生成Makefile.in的工具。爲了生成Makefile.in,automake還需用到perl,因爲automake建立的發佈徹底遵循GNU標準,因此在建立中不須要perl。libtool是一款方便生成各類程序庫的工具。
  pcre pcre-devel:在Nginx編譯須要 PCRE(Perl Compatible Regular Expression),由於Nginx 的Rewrite模塊和HTTP 核心模塊會使用到PCRE正則表達式語法。
  zlip zlib-devel:nginx啓用壓縮功能的時候,須要此模塊的支持。
  openssl openssl-devel:開啓SSL的時候須要此模塊的支持。
複製代碼
二、下載nginx 安裝包: 官網地址:http://nginx.org/sql

截止獲得當前,最新的版本爲1.8.1,在linux使用wget下載:apache

複製代碼
[root@Server1 ~]# wget http://nginx.org/download/nginx-1.8.1.tar.gz
--2016-04-23 10:22:55-- http://nginx.org/download/nginx-1.8.1.tar.gz
Resolving nginx.org (nginx.org)... 206.251.255.63, 95.211.80.227, 2001:1af8:4060:a004:21::e3, ...
Connecting to nginx.org (nginx.org)|206.251.255.63|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 833473 (814K) [application/octet-stream]
Saving to: ‘nginx-1.8.1.tar.gz.1’

100%[==============================================================================================================>] 833,473 251KB/s in 3.2s

2016-04-23 10:23:00 (251 KB/s) - ‘nginx-1.8.1.tar.gz.1’ saved [833473/833473]
複製代碼
三、解壓安裝包:

[root@Server1 ~]# tar xvf nginx-1.8.1.tar.gz
[root@Server1 ~]# cd nginx-1.8.1
[root@Server1 nginx-1.8.1]$ ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
四、編譯nginx:make

編譯是爲了檢查系統環境是否符合編譯安裝的要求,好比是否有gcc編譯工具,是否支持編譯參數當中的模塊,並根據開啓的參數等生成Makefile文件爲下一步作準備:

複製代碼
[root@Server1 nginx-1.8.1]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --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 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_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/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
複製代碼
結果以下:

五、生成腳本及配置文件:make

編譯步驟,根據Makefile文件生成相應的模塊

六、安裝:make install

建立目錄,並將生成的模塊和文件複製到相應的目錄:

備註:nginx完成安裝之後,有四個主要的目錄:

複製代碼
conf:保存nginx全部的配置文件,其中nginx.conf是nginx服務器的最核心最主要的配置文件,其餘的.conf則是用來配置nginx相關的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params兩個文件,配置文件通常都有個樣板配置文件,是文件名.default結尾,使用的使用將其複製爲並將default去掉便可。
html目錄中保存了nginx服務器的web文件,可是能夠更改成其餘目錄保存web文件,另外還有一個50x的web文件是默認的錯誤頁面提示頁面。
logs:用來保存nginx服務器的訪問日誌錯誤日誌等日誌,logs目錄能夠放在其餘路徑,好比/var/logs/nginx裏面。
sbin:保存nginx二進制啓動腳本,能夠接受不一樣的參數以實現不一樣的功能。
複製代碼

七、啓動:

將監聽端口改成8090,避免80端口衝突:

listen 8090;
八、經過命令啓動和關閉nginx:

複製代碼
[root@Server1 sbin]# /usr/local/nginx/sbin/nginx/nginx
nginx: [emerg] getpwnam("nginx") failed #沒有nginx用戶

[root@Server1 sbin]# /usr/local/nginx/sbin/nginx/nginx
nginx: [emerg] mkdir() "/var/tmp/nginx/client/" failed (2: No such file or directory) #目錄不存在

[root@Server1 sbin]# /usr/local/nginx/sbin/nginx/nginx #直到沒有報錯,纔算啓動完成
複製代碼
九、重讀配置文件和關閉服務:

[root@Server1 local]# /usr/local/nginx/sbin/nginx/nginx #啓動 服務
[root@Server1 local]# /usr/local/nginx/sbin/nginx/nginx -s reload #不中止服務重讀配置文件
[root@Server1 local]# /usr/local/nginx/sbin/nginx/nginx -s stop #中止服務 #中止服務
10.驗證端口是否開啓:

複製代碼
[root@Server1 sbin]# ps -ef | grep nginx
root 13228 1 0 Apr23 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx/nginx #nginx的主進程,只有一個主進程
nginx 13229 13228 0 Apr23 ? 00:00:00 nginx: worker process #nginx工做進程,默認只有一個,能夠經過修改nginx.conf中的worker_processes 1; 參數啓動多個工做進程
root 13295 1400 0 00:01 pts/0 00:00:00 grep --color=auto nginx

[root@Server1 local]# lsof -i:8090 #顯示佔用8090的進程
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 13337 root 6u IPv4 5932680 0t0 TCP :8090 (LISTEN)
nginx 13338 nginx 6u IPv4 5932680 0t0 TCP
:8090 (LISTEN)
複製代碼
十一、經過給nginx的主進程ID號發送信號啓動或中止nginx:

獲取nginx主進程號的辦法:

[root@Server1 nginx]# cat /var/run/nginx/nginx.pid #查看nginx的pid文件,此文件保存的就是nginx的主進程id
13337 #次ID是隨機的,每次啓動都不同的
[root@Server1 nginx]# ps -ef | grep nginx #過濾nginx的進程號
root 13337 1 0 00:05 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx/nginx
nginx 21568 13337 0 10:58 ? 00:00:00 nginx: worker process
支持的信號:

複製代碼
[root@Server1 nginx]# kill -QUIT 13337 #平緩關閉Nginx,即再也不接受新的請求,可是等當前請求處理完畢後再關閉Nginx。
[root@Server1 nginx]# kill -TERM 21665 #快速中止Nginx服務
[root@Server1 nginx]# kill -HUP 21703 #使用新的配置文件啓動進程而後平緩中止原有的nginx進程,即平滑重啓。
[root@Server1 nginx]# kill -USR1 21703 #從新打開配置文件,用於nginx 日誌切割
日期切割的腳本:
#!/bin/bash
PID=cat /var/run/nginx/nginx.pid
mv /var/log/nginx/access.log /var/log/nginx/date +%Y_%m_%d:%H:%M:%S.access.log
kill -USR1 $PID
[root@Server1 nginx]# kill -USR2 21703 #使用新版本的nginx文件啓動服務,而後在平緩中止原有的nginx服務,即平滑升級。
[root@Server1 nginx]# kill -WINCH 21703 #平滑中止nginx的工做進程,用於nginx平滑升級。
複製代碼

三:nginx 主配置文件:nginx.conf

3.1:默認配置:配置文件默認保存在path/conf當中,默認的配置文件爲nginx.conf,如下是編譯安裝後的默認配置:

複製代碼
[root@Server1 conf]# grep -v "#" nginx.conf | grep -v "^$"
  #全局生效,主要設置nginx的啓動用戶/組,啓動的工做進程數量,Nginx的PID路徑,日誌路徑等。
worker_processes 1; #默認啓動一個工做進程
events { #events設置快,主要影響nginx服務器與用戶的網絡鏈接,好比是否容許同時接受多個網絡鏈接,使用哪一種事件驅動模型處理請求,每一個工做進程能夠同時支持的最大鏈接數,是否開啓對多工做進程下的網絡鏈接進行序列化等。
worker_connections 1024; #設置nginx能夠接受的最大併發,多個進程只和
}
http { #http塊是Nginx服務器配置中的重要部分,緩存、代理和日誌格式定義等絕大多數功能和第三方模塊均可以在這設置,http塊能夠包含多個server塊,而一個server塊中又能夠包含多個location塊,server塊能夠配置文件引入、MIME-Type定義、日誌自定義、是否啓用sendfile、鏈接超時時間和單個連接的請求上限等。

include       mime.types;  #文件擴展名與文件類型映射表
default_type  application/octet-stream; #默認文件類型
sendfile        on; #是否調用 sendfile 函數(zero copy -->零copy方式)來輸出文件,普通應用打開,能夠大幅提高nginx的讀文件性能,若是服務器是下載的就須要關閉,
keepalive_timeout  65;  #長鏈接超時時間,單位是秒
server { #設置一個虛擬機主機,能夠包含本身的全局快,同時也能夠包含多個locating模塊。好比本虛擬機監聽的端口、本虛擬機的名稱和IP配置,多個server 可使用一個端口,好比都使用8090端口提供web服務、
    listen       8090;  #server的全局配置,配置監聽的端口
    server_name  localhost;  #本server的名稱,當訪問此名稱的時候nginx會調用當前serevr內部的配置進程匹配。
    location / {  #location實際上是server的一個指令,爲nginx服務器提供比較多並且靈活的指令,都是在location中提現的,主要是基於nginx接受到的請求字符串,對用戶請求的UIL進行匹配,並對特定的指令進行處理,包括地址重定向、數據緩存和應答控制等功能都是在這部分實現,另外不少第三方模塊的配置也是在location模塊中配置。
        root   html;  #至關於默認頁面的目錄名稱,默認是相對路徑,可使用絕對路徑配置。
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;  #錯誤頁面的文件名稱
    location = /50x.html {  #location處理對應的不一樣錯誤碼的頁面定義到/50x.html,這個跟對應其server中定義的目錄下。
        root   html;   #定義默認頁面所在的目錄
    }
}

}
複製代碼
3.2:配置nginx 主進程的啓動用戶和工做進程數:

user xxxx; #每一條指令都要以分號結尾
worker_processes 1; #能夠指定啓動的固定nginx進程數,或使用auto,auto是啓動與當前CPU 線程相同的進程數,如CPU是四核八線程的就啓動八個進程的Nginx工做進程。
3.3:綁定Nginx 工做進程到不一樣的CPU上:

  默認Nginx是不進行保定的,綁定並不能是當前nginx進程獨佔以一核心CPU,可是能夠保證此進程不會運行在其餘核心上,這就極大減小了nginx 工做進程在不一樣cpu上的跳轉,減小了CPU對進程的資源分配與回收,所以能夠有效的提高nginx服務器的性能,配置以下:

複製代碼
[root@Server1 nginx]# grep process /proc/cpuinfo | wc -l #確認CPU的核心數量
4
四個線程CPU的配置:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

八個線程CPU的配置:
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
複製代碼
3.4:PID和錯誤日誌文件路徑:

複製代碼
#pid logs/nginx.pid; #能夠指定絕對路徑
#error_log logs/error.log; #指定錯誤日誌路徑
#error_log logs/error.log notice; #指定一個日誌記錄級別
#error_log logs/error.log info;

支持的日誌級別:
語法:
error_log file [ debug | info | notice | warn | error | crit ] | [{ debug_core | debug_alloc | debug_mutex | debug_event | debug_http | debug_mail | debug_mysql } ]
日誌級別 = 錯誤日誌級別 | 調試日誌級別; 或者
日誌級別 = 錯誤日誌級別;
錯誤日誌的級別: emerg, alert, crit, error, warn, notic, info, debug,
調試日誌的級別: debug_core, debug_alloc, debug_mutex, debug_event, debug_http, debug_mail, debug_mysql

error_log 指令的日誌級別配置分爲錯誤日誌級別和調試日誌級別,錯誤日誌只能設置一個級別,並且錯誤日誌必須書寫在調試日誌級別的前面,另外調試日誌能夠設置多個級別,其餘配置方法可能沒法知足需求。
複製代碼
3.5:配置文件的引入:include

複製代碼
include file; #file是要導入的文件,支持相對路徑,通常在html目錄裏面
導入一個conf文件,並配置不一樣主機名的頁面,編輯nginx.conf主配置文件:
include /usr/local/nginx/conf.d/samsung.conf; #在最後一個大括號裏面加入一項,*是導入任何以conf結尾的配置文件

在/usr/local/nginx/conf.d/建立一個samsung.conf,內容以下:[root@Server1 nginx]# grep -v "#" conf.d/samsung.conf | grep -v "^$"server {listen 8090;server_name samsung.chinacloudapp.cn;location / {root html;index index1.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}

相關文章
相關標籤/搜索