1.1 準備源碼包
- pcre
http://www.pcre.org/
- zlib
http://www.zlib.net/
- openssl
http://www.openssl.org/
- echo-nginx-module
https://github.com/openresty/echo-nginx-module/tags
該模塊主要用于方便開發(fā)人員調(diào)試浪听,建議安裝該模塊片择,可便于調(diào)試
* ngx_devel_kit
https://github.com/simpl/ngx_devel_kit
* set-misc-nginx-module
https://github.com/openresty/set-misc-nginx-module
該模塊主要用于decode uri, 依賴ngx_devel_kit模塊
* luajit
* lua-nginx-module
https://github.com/chaoslawful/lua-nginx-module
該模塊用于支持lua語言,有高并發(fā)自定義需求建議安裝瘫俊。
* nginx
### 1.2 源碼安裝
1. 安裝libunwind庫
下載:http://download.savannah.gnu.org/releases/libunwind
解壓:
tar -zxvf libunwind-1.1.tar.gz
安裝:
./configure
make CFLAGS=-fPIC
sudo make CFLAGS=-fPIC install
* 安裝google-perftools
下載:http://google-perftools.googlecode.com
解壓:
tar -zxvf gperftools-2.1.tar.gz
安裝:
./configure
make
sudo make install
配置環(huán)境:
sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
sudo ldconfig
* 安裝luajit(Nginx暫時只支持到Lua5.1磕洪,不需要支持Lua開發(fā)可跳過此步驟)
wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar zxf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
make
make install PREFIX=/data/software/luajit
添加環(huán)境變量
export LUAJIT_LIB=/data/software/luajit/lib
export LUAJIT_INC=/data/software/luajit/include/luajit-2.0
* 解壓&&進入安裝目錄
tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0
* 取消debug模式
**vim auto/cc/gcc**
debug
:178
CFLAGS=”$CFLAGS -g”
==>
debug
CFLAGS=”$CFLAGS -g”
* 將nginx默認日志格式改為datatime格式
**vim src/http/modules/ngx_http_log_module.c**
:222
{ ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1,
ngx_http_log_time }
==>
{ ngx_string("time_local"), sizeof("1970-09-28 12:00:00 +0600") - 1,
ngx_http_log_time },
:810
return ngx_cpymem(buf, ngx_cached_http_log_time.data,
ngx_cached_http_log_time.len);
==>
return ngx_cpymem(buf, ngx_cached_err_log_time.data,
ngx_cached_err_log_time.len);
**vim src/core/ngx_times.c**
:149
(void) ngx_sprintf(p1, "%4d/%02d/%02d %02d:%02d:%02d",
tm.ngx_tm_year, tm.ngx_tm_mon,
tm.ngx_tm_mday, tm.ngx_tm_hour,
tm.ngx_tm_min, tm.ngx_tm_sec);
==>
(void) ngx_sprintf(p1, "%4d-%02d-%02d %02d:%02d:%02d",
tm.ngx_tm_year, tm.ngx_tm_mon,
tm.ngx_tm_mday, tm.ngx_tm_hour,
tm.ngx_tm_min, tm.ngx_tm_sec);
* 配置
./configure
--prefix=/data/software/nginx
--sbin-path=/data/software/nginx/sbin/nginx
--conf-path=/data/software/nginx/etc/nginx.conf
--pid-path=/data/software/nginx/tmp/nginx.pid
--error-log-path=/data/software/nginx/log/error.log
--http-log-path=/data/software/nginx/log/access.log
--user=greentea
--group=greentea
--with-http_ssl_module
--with-http_realip_module
--with-http_stub_status_module
--with-google_perftools_module
--with-pcre=/data/software/src/pcre-8.34
--with-zlib=/data/software/src/zlib-1.2.8
--with-openssl=/data/software/src/openssl-1.0.1c
--add-module=/data/software/src/echo-nginx-module-0.53
--add-module=/data/software/src/ngx_devel_kit-0.2.19
--add-module=/data/software/src/set-misc-nginx-module-0.25
--add-module=/data/software/src/lua-nginx-module-0.10.0
* 安裝
make -j 8
make install
* 準備配置文件
拷貝nginx.conf至/data/software/nginx/etc下买雾,提供參考如下:
用戶
user greentea;
工作進程掷酗,根據(jù)硬件調(diào)整虽界,一般等于cpu核數(shù)
worker_processes 8;
錯誤日志 日志級別
error_log log/error.log;
pid放置的位置
pid tmp/nginx.pid;
google_perftools的線程目錄
google_perftools_profiles /data/greentea/tmp/tcmalloc/tcmalloc;
指定進程可以打開的最大描述符,最好與ulimit -n 的值保持一致
worker_rlimit_nofile 1048576;
events {
#使用epoll的I/O 模型
use epoll;
#工作進程的最大連接數(shù)量扛施,根據(jù)硬件調(diào)整鸿捧,和前面工作進程配合起來用,盡量大疙渣,但是別把cpu跑到100%就行
#每個進程允許的最多連接數(shù)匙奴, 理論上每臺nginx服務(wù)器的最大連接數(shù)為worker_processes*worker_connections
worker_connections 65536;
}
設(shè)定http服務(wù)器,利用它的反向代理功能提供負載均衡支持
http {
#設(shè)定mime類型,類型由mime.type文件定義
include mime.types;
default_type application/octet-stream;
charset utf-8;
log_format main '[$time_local] [$remote_addr] [$remote_user] [$http_x_forwarded_for] '
'[$request] [$status] [$request_time] [$body_bytes_sent] '
'[$http_referer] [$http_user_agent] [$bytes_sent] [$request_length]';
#用了log_format指令設(shè)置了日志格式之后妄荔,需要用access_log指令指定日志文件的存放路徑泼菌;
access_log log/access.log main;
#還原用戶真實IP
set_real_ip_from 127.0.0.1;
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
#客戶端請求頭部的緩沖區(qū)大小,這個可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置,getconf PAGESIZE
#client_header_buffer_size 4k;
#如果把它設(shè)置為比較大的數(shù)值啦租,例如256k哗伯,那么,無論使用firefox還是IE瀏覽器篷角,來提交任意小于256k的圖片焊刹,都很正常
#如果注釋該指令,使用默認的client_body_buffer_size設(shè)置恳蹲,也就是操作系統(tǒng)頁面大小的兩倍虐块,8k或者16k,問題就出現(xiàn)了嘉蕾。
#無論使用firefox4.0還是IE8.0贺奠,提交一個比較大,200k左右的圖片荆针,都返回500 Internal Server Error錯誤
client_body_buffer_size 512k;
# 客戶端最大上傳文件大小
client_max_body_size 1000m;
#客戶端保持連接超時時間
keepalive_timeout 60;
#客戶端請求頭讀取超時時間
#client_header_timeout 10;
#客戶端請求主體讀取超時時間
#client_body_timeout 10;
#客戶端響應超時時間
#send_timeout 10;
#sendfile指令指定 nginx 是否調(diào)用sendfile 函數(shù)(zero copy 方式)來輸出文件
#對于普通應用敞嗡,必須設(shè)為on,如果用來進行下載等應用磁盤IO重負載應用,可設(shè)置為off航背,
#以平衡磁盤與網(wǎng)絡(luò)IO處理速度,降低系統(tǒng)uptime
sendfile on;
#此選項允許或禁止使用socke的TCP_CORK的選項棱貌,此選項僅在使用sendfile的時候使用
#tcp_nopush on;
#
#tcp_nodelay on;
# http://www.cnblogs.com/rmbteam/archive/2011/10/26/2225010.html
# 是否開啟gzip數(shù)據(jù)壓縮
gzip on; #決定是否開啟gzip模塊
# 設(shè)置gzip申請內(nèi)存的大小,其作用是按塊大小的倍數(shù)申請內(nèi)存空間
# param1:int; param2:int(k) 后面單位是k
gzip_buffers 16 8k;
# 設(shè)置gzip壓縮等級玖媚,等級越底壓縮速度越快文件壓縮比越小,反之速度越慢文件壓縮比越大
# param:1-9
gzip_comp_level 6;
# 當返回內(nèi)容大于此值時才會使用gzip進行壓縮,以K為單位,當值為0時婚脱,所有頁面都進行壓縮
# param:int
gzip_min_length 1000;
# 用于識別http協(xié)議的版本今魔,早期的瀏覽器不支持gzip壓縮勺像,用戶會看到亂碼,所以為了支持前期版本加了此選項,目前此項基本可以忽略
# param: 1.0|1.1
# gzip_http_version 1.0
# Nginx做為反向代理的時候啟用错森,
gzip_proxied any;
# 設(shè)置需要壓縮的MIME類型,非設(shè)置值不進行壓縮
# param:text/html|application/x-javascript|text/css|application/xml
gzip_types text/plain text/css text/javascript application/x-javascript application/xml application/javascript;
gzip_vary on;
gzip_disable "msie6";
#后端服務(wù)器連接的超時時間_發(fā)起握手等候響應超時時間
proxy_connect_timeout 90;
#連接成功后_等候后端服務(wù)器響應時間_其實已經(jīng)進入后端的排隊之中等候處理(也可以說是后端服務(wù)器處理請求的時間)
proxy_read_timeout 180;
#后端服務(wù)器數(shù)據(jù)回傳時間_就是在規(guī)定時間之內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù)
proxy_send_timeout 180;
#設(shè)置從被代理服務(wù)器讀取的第一部分應答的緩沖區(qū)大小,通常情況下這部分應答中包含一個小的應答頭
#默認情況下這個值的大小為指令proxy_buffers中指定的一個緩沖區(qū)的大小吟宦,不過可以將其設(shè)置為更小
proxy_buffer_size 256k;
#設(shè)置用于讀取應答(來自被代理服務(wù)器)的緩沖區(qū)數(shù)目和大小
#默認情況也為分頁大小,根據(jù)操作系統(tǒng)的不同可能是4k或者8k
proxy_buffers 4 256k;
##
#proxy_busy_buffers_size 256k;
##設(shè)置在寫入proxy_temp_path時數(shù)據(jù)的大小涩维,預防一個工作進程在傳遞文件時阻塞太長
#proxy_temp_file_write_size 256k;
##proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區(qū)
#proxy_temp_path /data0/proxy_temp_dir;
##設(shè)置內(nèi)存緩存空間大小為200MB殃姓,1天沒有被訪問的內(nèi)容自動清除,硬盤緩存空間大小為30GB
#proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#表示使nginx阻止HTTP應答代碼為400或者更高的應答
#proxy_intercept_errors on;
#nginx等待后端返回
proxy_ignore_client_abort on;
#這個將為打開文件指定緩存,默認是沒有啟用的,max指定緩存數(shù)量宏赘,建議和打開文件數(shù)一致鸣戴,
#inactive是指經(jīng)過多長時間文件沒被請求后刪除緩存
#open_file_cache max=65535 inactive=60s;
#這個是指多長時間檢查一次緩存的有效信息
#open_file_cache_valid 80s;
#open_file_cache指令中的inactive參數(shù)時間內(nèi)文件的最少使用次數(shù)
#如果超過這個數(shù)字,文件描述符一直是在緩存中打開的
#如上例近顷,如果有一個文件在inactive時間內(nèi)一次沒被使用,它將被移除
#open_file_cache_min_uses 1;
#負載均衡組定義
#down:暫時不參與負載均衡
#backup:預留的備份機器,只有其它機器掛了才訪問
#max_fails:允許的請求失敗次數(shù)
#fail_timeout:服務(wù)請求失敗后该面,暫停服務(wù)時間
#upstream myservers {
# ip_hash;
# server 192.168.12.133:80;
# server 192.168.12.133:80 down;
# server 192.168.12.133:80 max_fails=3 fail_timeout=20ms;
#}
#fastcgi優(yōu)化配置
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 512k;
fastcgi_buffers 8 512k;
fastcgi_busy_buffers_size 1024;
fastcgi_temp_file_write_size 1024;
#include /data/software/nginx/etc/city.d/citys.geo.conf;
include /data/software/nginx/etc/vhost.d/*.conf;
}
* 啟動
/data/software/nginx/sbin/nginx
### 1.3 常見問題
1. 常用命令
啟動:
/data/software/nginx/sbin/nginx
停止:
/data/software/nginx/sbin/nginx -s stop
重新加載:
/data/software/nginx/sbin/nginx -s reload
測試配置文件是否正確:
/data/software/nginx/sbin/nginx -t
/data/software/nginx/sbin/nginx -t /data/software/nginx/etc/nginx.conf
2. 添加開機啟動
在/etc/init.d/中建立軟連接
sudo ln -s /data/software/nginx/nginx /etc/init.d/nginx
更新rc
sudo update-rc.d -f nginx remove
sudo update-rc.d -f nginx defaults
3. openssl編譯錯誤
錯誤信息
/usr/bin/ranlib ../../libcrypto.a || echo Never mind.
make[4]: Leaving directory /data/software/src/openssl-1.0.1c/crypto/cmac' if [ -n "" ]; then \ (cd ..; make libcrypto.so.1.0.0); \ fi make[3]: Leaving directory
/data/software/src/openssl-1.0.1c/crypto'
make[2]: Leaving directory /data/software/src/openssl-1.0.1c' make[1]: *** [/data/software/src/openssl-1.0.1c/.openssl/include/openssl/ssl.h] 錯誤 2 make[1]: Leaving directory
/data/software/src/nginx-1.8.0'
make: *** [build] 錯誤 2
**vim auto/lib/openssl/conf**
:31
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
==>
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/libcrypto.a"