1.什麼是nginx?javascript
Nginx 是一個高性能的 Web 和反向代理服務器, 它具備有不少很是優越的特性:php
做爲 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的併發鏈接,體現更高的效率,這點使 Nginx 尤爲受到虛擬主機提供商的歡迎。可以支持高達 50,000 個併發鏈接數的響應,感謝 Nginx 爲咱們選擇了 epoll and kqueue 做爲開發模型.css
做爲負載均衡服務器:Nginx 既能夠在內部直接支持 Rails 和 PHP,也能夠支持做爲 HTTP代理服務器 對外進行服務。Nginx 用 C 編寫, 不管是系統資源開銷仍是 CPU 使用效率都比 Perlbal 要好的多。html
做爲郵件代理服務器: Nginx 同時也是一個很是優秀的郵件代理服務器(最先開發這個產品的目的之一也是做爲郵件代理服務器),Last.fm 描述了成功而且美妙的使用經驗。前端
Nginx 安裝很是的簡單,配置文件 很是簡潔(還可以支持perl語法),Bugs很是少的服務器: Nginx 啓動特別容易,而且幾乎能夠作到7*24不間斷運行,即便運行數個月也不須要從新啓動。你還可以在 不間斷服務的狀況下進行軟件版本的升級。java
nginx可使用各平臺的默認包來安裝,本文是介紹使用源碼編譯安裝,包括具體的編譯參數信息。mysql
正式開始前,編譯環境gcc g++ 開發庫之類的須要提早裝好,這裏默認你已經裝好。linux
ububtu平臺編譯環境可使用如下指令nginx
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壓縮。
1.選定源碼目錄
能夠是任何目錄,本文選定的是/usr/local/src
cd /usr/local/src
2.安裝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.34.tar.gz tar -zxvf pcre-8.34.tar.gz cd pcre-8.34 ./configure make make install
3.安裝zlib庫
http://zlib.net/zlib-1.2.8.tar.gz 下載最新的 zlib 源碼包,使用下面命令下載編譯和安裝 zlib包:
cd /usr/local/src wget http://zlib.net/zlib-1.2.8.tar.gz tar -zxvf zlib-1.2.8.tar.gz cd zlib-1.2.8 ./configure make make install
4.安裝ssl(某些vps默認沒裝ssl)
cd /usr/local/src wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz tar -zxvf openssl-1.0.1c.tar.gz
5.安裝nginx
Nginx 通常有兩個版本,分別是穩定版和開發版,您能夠根據您的目的來選擇這兩個版本的其中一個,下面是把 Nginx 安裝到 /usr/local/nginx 目錄下的詳細步驟:
cd /usr/local/src wget http://nginx.org/download/nginx-1.4.2.tar.gz tar -zxvf nginx-1.4.2.tar.gz cd nginx-1.4.2 ./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.34 \ --with-zlib=/usr/local/src/zlib-1.2.8 \ --with-openssl=/usr/local/src/openssl-1.0.1c make make install
--with-pcre=/usr/src/pcre-8.34 指的是pcre-8.34 的源碼路徑。
--with-zlib=/usr/src/zlib-1.2.7 指的是zlib-1.2.7 的源碼路徑。
安裝成功後 /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
6.啓動
確保系統的 80 端口沒被其餘程序佔用,運行/usr/local/nginx/nginx 命令來啓動 Nginx,
netstat -ano|grep 80
若是查不到結果後執行,有結果則忽略此步驟(ubuntu下必須用sudo啓動,否則只能在前臺運行)
sudo /usr/local/nginx/nginx
打開瀏覽器訪問此機器的 IP,若是瀏覽器出現 Welcome to nginx! 則表示 Nginx 已經安裝並運行成功。
-----------------------------------------------------
到這裏nginx就安裝完成了,若是隻是處理靜態html就不用繼續安裝了
若是你須要處理php腳本的話,還須要安裝php-fpm。
下面安裝排錯
附:可能遇到的錯誤和一些幫助信息
1.1編譯pcre錯誤
libtool: compile: unrecognized option `-DHAVE_CONFIG_H' libtool: compile: Try `libtool --help' for more information. make[1]: *** [pcrecpp.lo] Error 1 make[1]: Leaving directory `/usr/local/src/pcre-8.34' make: *** [all] Error 2
解決辦法:安裝g++,別忘了從新configure
apt-get install g++ apt-get install build-essential make clean ./configure make
1.2 make出錯
make: *** No rule to make target `build', needed by `default'. Stop. ./configure: error: SSL modules require the OpenSSL library. You can either do not enable the modules, or install the OpenSSL library into the system, or build the OpenSSL library statically from the source with nginx by using --with-openssl= option.
按照第4步的安裝方法或
ubuntu下
apt-get install openssl apt-get install libssl-dev
centos下
yum -y install openssl openssl-devel
2.nginx編譯選項
make是用來編譯的,它從Makefile中讀取指令,而後編譯。
make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。
configure命令是用來檢測你的安裝平臺的目標特徵的。它定義了系統的各個方面,包括nginx的被容許使用的鏈接處理的方法,好比它會檢測你是否是有CC或GCC,並非須要CC或GCC,它是個shell腳本,執行結束時,它會建立一個Makefile文件。nginx的configure命令支持如下參數:
--prefix=path
定義一個目錄,存放服務器上的文件 ,也就是nginx的安裝目錄。默認使用 /usr/local/nginx。
--sbin-path=path
設置nginx的可執行文件的路徑,默認爲 prefix
/sbin/nginx
.--conf-path=path
設置在nginx.conf配置文件的路徑。nginx容許使用不一樣的配置文件啓動,經過命令行中的-c選項。默認爲prefix
/conf/nginx.conf
.--pid-path=path 設置nginx.pid文件,將存儲的主進程的進程號。安裝完成後,能夠隨時改變的文件名 , 在nginx.conf配置文件中使用 PID指令。默認狀況下,文件名 爲
prefix
/logs/nginx.pid
.--error-log-path=path
設置主錯誤,警告,和診斷文件的名稱。安裝完成後,能夠隨時改變的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默認狀況下,文件名 爲prefix
/logs/error.log
.--http-log-path=path
設置主請求的HTTP服務器的日誌文件的名稱。安裝完成後,能夠隨時改變的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默認狀況下,文件名 爲prefix
/logs/access.log
.--user=name
設置nginx工做進程的用戶。安裝完成後,能夠隨時更改的名稱在nginx.conf配置文件中 使用的 user指令。默認的用戶名是nobody。--group=name
設置nginx工做進程的用戶組。安裝完成後,能夠隨時更改的名稱在nginx.conf配置文件中 使用的 user指令。默認的爲非特權用戶。--with-select_module
--without-select_module 啓用或禁用構建一個模塊來容許服務器使用select()方法。該模塊將自動創建,若是平臺不支持的kqueue,epoll,rtsig或/dev/poll。
--with-poll_module
--without-poll_module
啓用或禁用構建一個模塊來容許服務器使用poll()方法。該模塊將自動創建,若是平臺不支持的kqueue,epoll,rtsig或/dev/poll。--without-http_gzip_module
— 不編譯壓縮的HTTP服務器的響應模塊。編譯並運行此模塊須要zlib庫。--without-http_rewrite_module
不編譯重寫模塊。編譯並運行此模塊須要PCRE庫支持。--without-http_proxy_module
— 不編譯http_proxy模塊。--with-http_ssl_module
— 使用https協議模塊。默認狀況下,該模塊沒有被構建。創建並運行此模塊的OpenSSL庫是必需的。--with-pcre=path
— 設置PCRE庫的源碼路徑。PCRE庫的源碼(版本4.4 - 8.30)須要從PCRE網站下載並解壓。其他的工做是Nginx的./ configure和make來完成。正則表達式使用在location指令和 ngx_http_rewrite_module 模塊中。--with-pcre-jit
—編譯PCRE包含「just-in-time compilation」(1.1.12中, pcre_jit指令)。--with-zlib=path
—設置的zlib庫的源碼路徑。要下載從 zlib(版本1.1.3 - 1.2.5)的並解壓。其他的工做是Nginx的./ configure和make完成。ngx_http_gzip_module模塊須要使用zlib 。--with-cc-opt=parameters
— 設置額外的參數將被添加到CFLAGS變量。例如,當你在FreeBSD上使用PCRE庫時須要使用:--with-cc-opt="-I /usr/local/include。
.如須要須要增長 select()支持的文件數量
:--with-cc-opt="-D FD_SETSIZE=2048".
--with-ld-opt=parameters
—設置附加的參數,將用於在連接期間。例如,當在FreeBSD下使用該系統的PCRE庫,應指定:--with-ld-opt="-L /usr/local/lib".
典型實例(下面爲了展現須要寫在多行,執行時內容須要在同一行)
./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=../pcre-4.4 --with-zlib=../zlib-1.1.3
3.nginx簡單配置詳解(從welcome to nginx開始上手)
#運行用戶 user nobody; #啓動進程,一般設置成和cpu的數量相等 worker_processes 1; #全局錯誤日誌及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; #工做模式及鏈接數上限 events { #epoll是多路複用IO(I/O Multiplexing)中的一種方式, #僅用於linux2.6以上內核,能夠大大提升nginx的性能 use epoll; #單個後臺worker process進程的最大併發連接數 worker_connections 1024; # 併發總數是 worker_processes 和 worker_connections 的乘積 # 即 max_clients = worker_processes * worker_connections # 在設置了反向代理的狀況下,max_clients = worker_processes * worker_connections / 4 爲何 # 爲何上面反向代理要除以4,應該說是一個經驗值 # 根據以上條件,正常狀況下的Nginx Server能夠應付的最大鏈接數爲:4 * 8000 = 32000 # worker_connections 值的設置跟物理內存大小有關 # 由於併發受IO約束,max_clients的值須小於系統能夠打開的最大文件數 # 而系統能夠打開的最大文件數和內存大小成正比,通常1GB內存的機器上能夠打開的文件數大約是10萬左右 # 咱們來看看360M內存的VPS能夠打開的文件句柄數是多少: # $ cat /proc/sys/fs/file-max # 輸出 34336 # 32000 < 34336,即併發鏈接總數小於系統能夠打開的文件句柄總數,這樣就在操做系統能夠承受的範圍以內 # 因此,worker_connections 的值需根據 worker_processes 進程數目和系統能夠打開的最大文件總數進行適當地進行設置 # 使得併發總數小於操做系統能夠打開的最大文件數目 # 其實質也就是根據主機的物理CPU和內存進行配置 # 固然,理論上的併發總數可能會和實際有所誤差,由於主機還有其餘的工做進程須要消耗系統資源。 # ulimit -SHn 65535 } http { #設定mime類型,類型由mime.type文件定義 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 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件, #對於普通應用,必須設爲 on, #若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off, #以平衡磁盤與網絡I/O處理速度,下降系統的uptime. sendfile on; #tcp_nopush on; #鏈接超時時間 #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; #開啓gzip壓縮 gzip on; gzip_disable "MSIE [1-6]."; #設定請求緩衝 client_header_buffer_size 128k; large_client_header_buffers 4 128k; #設定虛擬主機配置 server { #偵聽80端口 listen 80; #定義使用 www.nginx.cn訪問 server_name www.nginx.cn; #定義服務器的默認網站根目錄位置 root html; #設定本虛擬主機的訪問日誌 access_log logs/nginx.access.log main; #默認請求 location / { #定義首頁索引文件的名稱 index index.php index.html index.htm; } # 定義錯誤提示頁面 error_page 500 502 503 504 /50x.html; location = /50x.html { } #靜態文件,nginx本身處理 location ~ ^/(images|javascript|js|css|flash|media|static)/ { #過時30天,靜態文件不怎麼更新,過時能夠設大一點, #若是頻繁更新,則能夠設置得小一點。 expires 30d; } #PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI默認配置. location ~ .php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index