編譯安裝nginx并配置
[TOC]
reference1: https://www.runoob.com/linux/nginx-install-setup.html --> nginx
reference2: https://www.cnblogs.com/felixzh/p/6283791.html --> nginx編譯參數(shù)詳解
reference3: https://www.cnblogs.com/knowledgesea/p/5175711.html --> nginx配置詳解
1. 安裝編譯工具及庫文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre-devel # 或
yum -y groupinstall "Development Tools" "Server Platform Development" \
--setopt=group_package_types=mandatory,default,optional # 此步驟較慢
2. 安裝pcre
# pcre 作用是讓 Nginx 支持 Rewrite 功能
cd /usr/local/src/
wget https://jaist.dl.sourceforge.net/project/pcre/pcre2/10.33/pcre2-10.33.tar.gz
cd pcre2-10.33 # 還是下載8.x版本, nginx暫時(shí)不支持10版本的pcre
./configure --prefix=/usr/local/pcre
make && make install
pcre-config --version # 查看pcre版本
3. 安裝 Nginx
1. 創(chuàng)建 Nginx 運(yùn)行使用的用戶 nginx
/usr/sbin/groupadd nginx
/usr/sbin/useradd -r -s /sbin/nologin -g nginx nginx
2. 編譯安裝nginx
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.16.0.tar.gz
tar xf nginx-1.16.0.tar.gz
cd nginx-1.16.0
/configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx \
--with-http_realip_module \
--with-http_flv_module \ # 流媒體
--with-http_image_filter_module \ # 需要安裝GD庫
--with-http_gzip_static_module \
--with-http_gunzip_module \ # 支持壓縮
--with-http_stub_status_module \ # 健康探測頁面
--with-http_ssl_module \
--with-threads \
--with-file-aio \
--with-pcre=/usr/local/src/pcre # 目前nginx還暫時(shí)不支持10版本的pcre
-error-log-path= \ # 錯(cuò)誤日志路徑, 默認(rèn)均在--prefix指定目錄下
-http-log-path= \ # http日志路徑
# 可在./configure時(shí)多次重復(fù)設(shè)置, 編譯時(shí)的參數(shù)最好保存
make && make install
/usr/local/webserver/nginx/sbin/nginx -v # 查看nginx版本, 到此安裝完成
以下是編譯參數(shù)詳解:
--prefix= 指向安裝目錄
--sbin-path= 指定執(zhí)行程序文件存放位置
--modules-path= 指定第三方模塊的存放路徑
--conf-path= 指定配置文件存放位置
--error-log-path= 指定錯(cuò)誤日志存放位置
--pid-path= 指定pid文件存放位置
--lock-path= 指定lock文件存放位置
--user= 指定程序運(yùn)行時(shí)的非特權(quán)用戶
--group= 指定程序運(yùn)行時(shí)的非特權(quán)用戶組
--builddir= 指向編譯目錄
--with-rtsig_module 啟用rtsig模塊支持
--with-select_module 啟用select模塊支持, 一種輪詢處理方式, 不推薦在高并發(fā)環(huán)境中使用, 禁用:--without-select_module
--with-poll_module 啟用poll模塊支持,功能與select相同, 不推薦在高并發(fā)環(huán)境中使用
--with-threads 啟用thread pool支持
--with-file-aio 啟用file aio支持
--with-http_ssl_module 啟用https支持
--with-http_v2_module 啟用ngx_http_v2_module支持
--with-ipv6 啟用ipv6支持
--with-http_realip_module 允許從請(qǐng)求報(bào)文頭中更改客戶端的ip地址, 默認(rèn)為關(guān)
--with-http_addition_module 啟用ngix_http_additon_mdoule支持(作為一個(gè)輸出過濾器, 分部分響應(yīng)請(qǐng)求)
--with -http_xslt_module 啟用ngx_http_xslt_module支持, 過濾轉(zhuǎn)換XML請(qǐng)求
--with-http_image_filter_mdoule 啟用ngx_http_image_filter_module支持, 傳輸JPEG\GIF\PNG圖片的一個(gè)過濾器, 默認(rèn)不啟用, 需要安裝gd庫
--with-http_geoip_module 啟用ngx_http_geoip_module支持, 用于創(chuàng)建基于MaxMind GeoIP二進(jìn)制文件相配的客戶端IP地址的ngx_http_geoip_module變量
--with-http_sub_module 啟用ngx_http_sub_module支持, 允許用一些其他文本替換nginx響應(yīng)中的一些文本
--with-http_dav_module 啟用ngx_http_dav_module支持, 增加PUT润努、DELETE波丰、MKCOL創(chuàng)建集合, COPY和MOVE方法, 默認(rèn)為關(guān)閉, 需要編譯開啟
--with-http_flv_module 啟用ngx_http_flv_module支持, 提供尋求內(nèi)存使用基于時(shí)間的偏移量文件
--with-http_mp4_module 啟用ngx_http_mp4_module支持, 啟用對(duì)mp4類視頻文件的支持
--with-http_gzip_static_module 啟用ngx_http_gzip_static_module支持, 支持在線實(shí)時(shí)壓縮輸出數(shù)據(jù)流
--with-http_random_index_module 啟用ngx_http_random_index_module支持, 從目錄中隨機(jī)挑選一個(gè)目錄索引
--with-http_secure_link_module 啟用ngx_http_secure_link_module支持, 計(jì)算和檢查要求所需的安全鏈接網(wǎng)址
--with-http_degradation_module 啟用ngx_http_degradation_module 支持允許在內(nèi)存不足的情況下返回204或444代碼
--with-http_stub_status_module 啟用ngx_http_stub_status_module 支持查看nginx的狀態(tài)頁
--without-http_charset_module 禁用ngx_http_charset_module這一模塊, 可以進(jìn)行字符集間的轉(zhuǎn)換, 從其它字符轉(zhuǎn)換成UTF-8或者從UTF8轉(zhuǎn)換成其它字符. 它只能從服務(wù)器到客戶端方向, 只有一個(gè)字節(jié)的字符可以轉(zhuǎn)換
--without-http_gzip_module 禁用ngx_http_gzip_module支持, 同--with-http_gzip_static_module功能一樣
--without-http_ssi_module 禁用ngx_http_ssi_module支持, 提供了一個(gè)在輸入端處理服務(wù)器包含文件(SSI) 的過濾器
--without-http_userid_module 禁用ngx_http_userid_module支持, 該模塊用來確定客戶端后續(xù)請(qǐng)求的cookies
--without-http_access_module 禁用ngx_http_access_module支持, 提供了基于主機(jī)ip地址的訪問控制功能
--without-http_auth_basic_module 禁用ngx_http_auth_basic_module支持, 可以使用用戶名和密碼認(rèn)證的方式來對(duì)站點(diǎn)或部分內(nèi)容進(jìn)行認(rèn)證
--without-http_autoindex_module 禁用ngx_http_authindex_module, 該模塊用于在ngx_http_index_module模塊沒有找到索引文件時(shí)發(fā)出請(qǐng)求, 用于自動(dòng)生成目錄列表
--without-http_geo_module 禁用ngx_http_geo_module支持, 這個(gè)模塊用于創(chuàng)建依賴于客戶端ip的變量
--without-http_map_module 禁用ngx_http_map_module支持, 使用任意的鍵、值 對(duì)設(shè)置配置變量
--without-http_split_clients_module 禁用ngx_http_split_clients_module支持, 該模塊用于基于用戶ip地址玉吁、報(bào)頭链韭、cookies劃分用戶
--without-http_referer_module 禁用ngx_http_referer_modlue支持, 該模塊用來過濾請(qǐng)求, 報(bào)頭中Referer值不正確的請(qǐng)求
--without-http_rewrite_module 禁用ngx_http_rewrite_module支持. 該模塊允許使用正則表達(dá)式改變URI, 并且根據(jù)變量來轉(zhuǎn)向以及選擇配置. 如果在server級(jí)別設(shè)置該選項(xiàng), 那么將在location之前生效, 但如果location中還有更進(jìn)一步的重寫規(guī)則, location部分的規(guī)則依然會(huì)被執(zhí)行. 如果這個(gè)URI重寫是因?yàn)閘ocation部分的規(guī)則造成的, 那么location部分會(huì)再次被執(zhí)行作為新的URI, 這個(gè)循環(huán)會(huì)被執(zhí)行10次, 最后返回一個(gè)500錯(cuò)誤.
--without-http_proxy_module 禁用ngx_http_proxy_module支持, http代理功能
--without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持, 該模塊允許nginx與fastcgi進(jìn)程交互, 并通過傳遞參數(shù)來控制fastcgi進(jìn)程工作
--without-http_uwsgi_module 禁用ngx_http_uwsgi_module支持, 該模塊用來使用uwsgi協(xié)議, uwsgi服務(wù)器相關(guān)
--without-http_scgi_module 禁用ngx_http_scgi_module支持, 類似于fastcgi, 也是應(yīng)用程序與http服務(wù)的接口標(biāo)準(zhǔn)
--without-http_memcached_module 禁用ngx_http_memcached支持, 用來提供簡單的緩存, 提高系統(tǒng)效率
--without-http_limit_conn_module 禁用ngx_http_limit_conn_module支持, 該模塊可以根據(jù)條件進(jìn)行會(huì)話的并發(fā)連接數(shù)進(jìn)行限制
--without-http_limit_req_module 禁用ngx_limit_req_module支持, 該模塊可以實(shí)現(xiàn)對(duì)于一個(gè)地址進(jìn)行請(qǐng)求數(shù)量的限制
--without-http_empty_gif_module 禁用ngx_http_empty_gif_module支持, 該模塊在內(nèi)存中常駐了一個(gè)1*1的透明gif圖像, 可以被非撑惆祝快速的調(diào)用
--without-http_browser_module 禁用ngx_http_browser_mdoule支持, 創(chuàng)建依賴于請(qǐng)求報(bào)頭的值, 如果瀏覽器為modern, 則$modern_browser等于modern_browser_value的值;如果瀏覽器為old, 則$ancient_browser等于$ancient_browser_value指令分配的值硬纤;如果瀏覽器為MSIE, 則$msie等于1
--without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持, 該模塊用于簡單的負(fù)載均衡
--with-http_perl_module 啟用ngx_http_perl_module支持, 它使nginx可以直接使用perl或通過ssi調(diào)用perl
--with-perl_modules_path= 設(shè)定perl模塊路徑
--with-perl= 設(shè)定perl庫文件路徑
--http-log-path= 設(shè)定access log路徑
--http-client-body-temp-path= 設(shè)定http客戶端請(qǐng)求臨時(shí)文件路徑
--http-proxy-temp-path= 設(shè)定http代理臨時(shí)文件路徑
--http-fastcgi-temp-path= 設(shè)定http fastcgi臨時(shí)文件路徑
--http-uwsgi-temp-path= 設(shè)定http scgi臨時(shí)文件路徑
--http-scgi-temp-path= 設(shè)定http scgi臨時(shí)文件路徑
--without-http 禁用http server功能
--without-http-cache 禁用http cache功能
--with-mail 啟用POP3解滓、IMAP4、SMTP代理模塊
--with-mail_ssl_module 啟用ngx_mail_ssl_module支持
--without-mail_pop3_module 禁用pop3協(xié)議
--without-mail_iamp_module 禁用iamp協(xié)議
--without-mail_smtp_module 禁用smtp協(xié)議
--with-google_perftools_module 啟用ngx_google_perftools_mdoule支持, 調(diào)試用, 可以用來分析程序性能瓶頸
--with-cpp_test_module 啟用ngx_cpp_test_module支持
--add-module= 指定外部模塊路徑, 啟用對(duì)外部模塊的支持
--with-cc= 指向C編譯器路徑
--with-cpp= 指向C預(yù)處理路徑
--with-cc-opt= 設(shè)置C編譯器參數(shù), 指定--with-cc-opt="-I /usr/lcal/include", 如果使用select()函數(shù), 還需要同時(shí)指定文件描述符數(shù)量--with-cc-opt="-D FD_SETSIZE=2048" (PCRE庫)
--with-ld-opt= 設(shè)置連接文件參數(shù), 需要指定--with-ld-opt="-L /usr/local/lib" (PCRE庫)
--with-cpu-opt= 指定編譯的CPU類型, 如pentium,pentiumpro,...amd64,ppc64...
--without-pcre 禁用pcre庫
--with-pcre 啟用pcre庫
--with-pcre= 指向pcre庫文件目錄
--with-pcre-opt= 在編譯時(shí)為pcre庫設(shè)置附加參數(shù)
--with-md5= 指向md5庫文件目錄
--with-md5-opt= 編譯時(shí)為md5庫設(shè)置附加參數(shù)
--with-md5-asm 使用md5匯編源
--with-sha1= 指向sha1庫文件目錄
--with-sha1-opt= 編譯時(shí)為sha1庫設(shè)置附加參數(shù)
--with-sha1-asm 使用sha1匯編源
--with-zlib= 指向zlib庫文件目錄
--with-zlib-opt= 在編譯時(shí)為zlib設(shè)置附加參數(shù)
--with-zlib-asm= 為指定的CPU使用匯編源進(jìn)行優(yōu)化
--with-libatomic 為原子內(nèi)存的更新操作的實(shí)現(xiàn)提供一個(gè)架構(gòu)
--with-libatomic= 指向libatomic_ops的安裝目錄
--with-openssl= 指向openssl安裝目錄
--with-openssl-opt= 在編譯時(shí)為openssl設(shè)置附加參數(shù)
--with-debug 啟用debug日志
4. Nginx 配置
1. 編輯nginx配置文件
vi /usr/local/nginx/conf/nginx.conf # 將/usr/local/nginx/conf/nginx.conf替換為以下內(nèi)容
user nginx nginx;
worker_processes 2; # 設(shè)置值和CPU核心數(shù)一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; # 日志位置和日志級(jí)別
pid /usr/local/webserver/nginx/nginx.pid;
# Specifies the value for maximum file descriptors that can be opened by this process
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
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';
# charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
# limit_zone crawler $binary_remote_addr 10m;
# 下面是server虛擬主機(jī)的配置
server
{
listen 80; # 監(jiān)聽端口
server_name localhost; # 域名
index index.html index.htm index.php;
root /usr/local/webserver/nginx/html; # 站點(diǎn)目錄
location /status
{
stub_status on;
allow 172.16.0.0/16;
deny all;
}
location ~ .*\.(php|php5)?$
{
# fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d;
# access_log off;
}
location ~ .*\.(js|css)?$
{
expires 15d;
# access_log off;
}
access_log off;
}
}
2. 檢查配置文件nginx.conf的正確性
/usr/local/nginx/sbin/nginx -t
5. 啟動(dòng)Nginx
/usr/local/nginx/sbin/nginx
ps -ef | grep nginx # 查看nginx的master和worker
/usr/local/nginx/sbin/nginx -s reload # 重新載入配置文件
/usr/local/nginx/sbin/nginx -s reopen # 重啟 Nginx
/usr/local/nginx/sbin/nginx -s stop # 停止 Nginx
6. 自帶的健康檢測
利用nginx自帶模塊ngx_http_proxy_module和ngx_http_upstream_module對(duì)后端節(jié)點(diǎn)做健康檢查:
語法: proxy_connect_timeout time;
默認(rèn)值: proxy_connect_timeout 60s;
上下文: http, server, location
設(shè)置與后端服務(wù)器建立連接的超時(shí)時(shí)間. 應(yīng)該注意這個(gè)超時(shí)一般不可能大于75秒.
語法: proxy_read_timeout time;
默認(rèn)值: proxy_read_timeout 60s;
上下文: http, server, location
定義從后端服務(wù)器讀取響應(yīng)的超時(shí). 此超時(shí)是指相鄰兩次讀操作之間的最長時(shí)間間隔, 而不是整個(gè)響應(yīng)傳輸完成的最長時(shí)間. 如果后端服務(wù)器在超時(shí)時(shí)間段內(nèi)沒有傳輸任何數(shù)據(jù), 連接將被關(guān)閉.
語法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...;
默認(rèn)值: proxy_next_upstream error timeout;
上下文: http, server, location
指定在何種情況下一個(gè)失敗的請(qǐng)求應(yīng)該被發(fā)送到下一臺(tái)后端服務(wù)器:error 和后端服務(wù)器建立連接時(shí), 或者向后端服務(wù)器發(fā)送請(qǐng)求時(shí), 或者從后端服務(wù)器接收響應(yīng)頭時(shí), 出現(xiàn)錯(cuò)誤
timeout 和后端服務(wù)器建立連接時(shí), 或者向后端服務(wù)器發(fā)送請(qǐng)求時(shí), 或者從后端服務(wù)器接收響應(yīng)頭時(shí), 出現(xiàn)超時(shí)
invalid_header 后端服務(wù)器返回空響應(yīng)或者非法響應(yīng)頭
http_500 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為500
http_502 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為502
http_503 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為503
http_504 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為504
http_404 后端服務(wù)器返回的響應(yīng)狀態(tài)碼為404
off 停止將請(qǐng)求發(fā)送給下一臺(tái)后端服務(wù)器
需要理解一點(diǎn)的是, 只有在沒有向客戶端發(fā)送任何數(shù)據(jù)以前, 將請(qǐng)求轉(zhuǎn)給下一臺(tái)后端服務(wù)器才是可行的. 也就是說, 如果在傳輸響應(yīng)到客戶端時(shí)出現(xiàn)錯(cuò)誤或者超時(shí), 這類錯(cuò)誤是不可能恢復(fù)的.
upstream LB-WWW {
ip_hash;
#這是負(fù)載均衡的ip_hash負(fù)載策略筝家,好處是實(shí)現(xiàn)session共享洼裤。根據(jù)需求決定是否加這個(gè)配置。
server 192.168.1.101:80 max_fails=3 fail_timeout=30s;
#max_fails = 3 為允許失敗的次數(shù)溪王,默認(rèn)值為1腮鞍。 這是對(duì)后端節(jié)點(diǎn)做健康檢查。
server 192.168.1.102:80 max_fails=3 fail_timeout=30s;
#fail_timeout = 30s 當(dāng)max_fails次失敗后莹菱,暫停將請(qǐng)求分發(fā)到該后端服務(wù)器的時(shí)間
server 192.168.1.118:80 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name www.wangshibo.com;
access_log /usr/local/nginx/logs/www-access.log main;
error_log /usr/local/nginx/logs/www-error.log;
# 因?yàn)閡pstream配置里每個(gè)幾秒就會(huì)去健康后端機(jī)器, 當(dāng)連接失敗時(shí), 錯(cuò)誤信息就輸出到error.log日志里
location / {
proxy_pass http://LB-WWW;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
}
}