nginx 簡(jiǎn)介和通用配置
簡(jiǎn)介
nginx是web服務(wù)器,由C語言開發(fā),基于事件驅(qū)動(dòng)能處理百萬級(jí)別的tcp連接,高度模塊化的設(shè)計(jì)和自由的許可證使得擴(kuò)展其功能的模塊層出不窮,跨平臺(tái)梳猪,可使用當(dāng)前操作系統(tǒng)特有的一些高效API來提高自己的性能,nginx以性能為王蒸痹。選擇nginx的核心理由是處理高并發(fā)請(qǐng)求的同時(shí)保持高效的服務(wù)舔示。
優(yōu)點(diǎn)
- 更快
單次請(qǐng)求更快,高峰期也更快
- 高擴(kuò)展性
極具擴(kuò)展性电抚,它由多個(gè)不同功能惕稻、不同層次、不同類型且耦合度極高的模塊組成蝙叛,這種低耦合的設(shè)計(jì)俺祠,造就了它龐大的第三方模塊
- 高可靠性
每個(gè)worker進(jìn)程相對(duì)獨(dú)立,master進(jìn)程在某個(gè)worker進(jìn)程出錯(cuò)時(shí)能迅速拉起新的worker進(jìn)程借帘,nginx的可靠性來源于其核心框架代碼的優(yōu)秀設(shè)計(jì)蜘渣、模塊設(shè)計(jì)的簡(jiǎn)單性。官方提供的常用模塊都很穩(wěn)定肺然。
- 低內(nèi)存消耗
一般情況下10000個(gè)非活躍的keep-alive連接僅消耗2.5M的內(nèi)存
- 單機(jī)支持10萬以上的并發(fā)連接
nginx支持的并發(fā)連接上限取決于內(nèi)存蔫缸,10萬遠(yuǎn)沒封頂
- 熱部署
master管理進(jìn)程
worker工作進(jìn)程
- 最自由的BSD許可協(xié)議
nginx 配置一般分為6大塊,多數(shù)http中的配置都可以配置到server和location中
1、全局塊: 配置影響nginx全局的指令际起。一般有運(yùn)行nginx服務(wù)器的用戶組拾碌,nginx進(jìn)程pid存放路徑吐葱,日志存放路徑,配置文件引入校翔,允許生成worker process數(shù)等弟跑。
2、events塊: 配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接防症。有每個(gè)進(jìn)程的最大連接數(shù)孟辑,選取哪種事件驅(qū)動(dòng)模型處理連接請(qǐng)求,是否允許同時(shí)接受多個(gè)網(wǎng)路連接蔫敲,開啟多個(gè)網(wǎng)絡(luò)連接序列化等饲嗽。
3、http塊: 可以嵌套多個(gè)server奈嘿,配置代理喝噪,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置指么。如文件引入,mime-type定義榴鼎,日志自定義伯诬,是否使用sendfile傳輸文件,連接超時(shí)時(shí)間巫财,單連接請(qǐng)求數(shù)等盗似。
4、upstream: 配置代理服務(wù)平项,在http 模塊下赫舒,通過server端調(diào)用
5、server塊: 配置虛擬主機(jī)的相關(guān)參數(shù)闽瓢,一個(gè)http中可以有多個(gè)server
6接癌、location塊: 配置請(qǐng)求的路由,以及各種頁面的處理情況
下面是一份通用的nginx配置
# nginx 使用的用戶和組
user www www;
# worker角色的工作進(jìn)程的個(gè)數(shù)扣讼,這個(gè)數(shù)值簡(jiǎn)單一點(diǎn)可以設(shè)置為cpu的核數(shù)grep ^processor /proc/cpuinfo | wc -l缺猛,也是auto值
worker_processes auto;
# 指定全局日志路徑和文件名,可以在下方直接使用 [ debug | info | notice | warn | error | crit ] 參數(shù)
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 指定 pid 存放的路徑
pid logs/nginx.pid;
events {
# nginx默認(rèn)使用epoll事件模型,: use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];具體內(nèi)容查看 http://wiki.codemongers.com/事件模型
use epoll;
# 每一個(gè)worker進(jìn)程能并發(fā)處理(發(fā)起)的最大連接數(shù)(包含與客戶端或后端被代理服務(wù)器間等所有連接數(shù))
worker_connections 2048;
# 打開同時(shí)接受多個(gè)新網(wǎng)絡(luò)連接請(qǐng)求的功能椭符。 默認(rèn)為off
# multi_accept on;
# 優(yōu)化同一時(shí)刻只有一個(gè)請(qǐng)求而避免多個(gè)睡眠進(jìn)程被喚醒的設(shè)置荔燎,on為防止被同時(shí)喚醒,默認(rèn)為off
# accept_mutex on;
}
http {
# 文件擴(kuò)展名與文件類型映射表销钝,設(shè)定mime類型,類型由mime.type文件定義
include mime.types;
# 配置默認(rèn)的mime類型
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;
# 開啟高效文件傳輸模式有咨,對(duì)于普通應(yīng)用設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁盤IO重負(fù)載應(yīng)用蒸健,可設(shè)置為off
sendfile on;
# socket包累計(jì)到一定大小后就發(fā)送
# tcp_nopush on;
# 強(qiáng)制socket在它的緩沖區(qū)里0.2秒后發(fā)送數(shù)據(jù)座享,tcp_nopush 配置和 tcp_nodelay "互斥"
# tcp_nodelay on;
# 長(zhǎng)連接超時(shí)時(shí)間婉商,單位是秒
keepalive_timeout 65;
# 【gzip壓縮功能設(shè)置】:gzip和gzip_static模塊可以搭配使用,也可獨(dú)立使用征讲,gzip內(nèi)置据某,gzip_static官方說不內(nèi)置,上下文:http,server,location诗箍,可以使用nginx -V 來查看是否安裝某個(gè)模塊
# 是否開啟gzip, 默認(rèn)off,符合條件的都要壓縮癣籽,使用建議搭配緩存
# gzip on;
# 是否開啟 gzip_static, 默認(rèn)off,會(huì)在同路徑下先找尋同名.gz壓縮文件滤祖,找到直接返回筷狼,未找到,壓縮后返回匠童,建議手動(dòng)壓縮
gzip_static on;
# 當(dāng)返回內(nèi)容大于此值時(shí)才會(huì)使用gzip進(jìn)行壓縮埂材,以K為單位,當(dāng)值為0時(shí),所有頁面都進(jìn)行壓縮汤求。根據(jù)具體情況修改
gzip_min_length 3k;
# 緩沖(壓縮在內(nèi)存中緩沖幾塊? 每塊多大?)俏险,32 4K| 16 8K,建議用默認(rèn)
# gzip_buffers 4 16k;
# 開始?jí)嚎s的http協(xié)議版本(可以不設(shè)置,目前幾乎全是1.1協(xié)議)扬绪,1.0|1.1竖独,默認(rèn)1.1,如果是反向代理挤牛,考慮使用1.0
gzip_http_version 1.0;
# 設(shè)置請(qǐng)求者代理服務(wù)器,該如何緩存內(nèi)容莹痢,off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any, 默認(rèn):off
# gzip_proxied any
# 推薦6 壓縮級(jí)別(級(jí)別越高,壓的越小,越浪費(fèi)CPU計(jì)算資源)
gzip_comp_level 6;
# 對(duì)哪些類型的文件用壓縮 如txt,xml,html ,css
# gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
# 增加響應(yīng)頭”Vary: Accept-Encoding”
gzip_vary on;
# 【http_proxy 設(shè)置】 上下文:http,server,location
# 限制請(qǐng)求體的大小,若超過所設(shè)定的大小墓赴,返回413錯(cuò)誤竞膳。默認(rèn)1m
client_max_body_size 30m;
# 分配給請(qǐng)求數(shù)據(jù)的Buffer大小,請(qǐng)求的數(shù)據(jù)小于client_body_buffer_size直接將數(shù)據(jù)先在內(nèi)存中存儲(chǔ)诫硕。如果請(qǐng)求的值大于client_body_buffer_size小于client_max_body_size坦辟,就會(huì)將數(shù)據(jù)先存儲(chǔ)到臨時(shí)文件中,臨時(shí)文件路徑為client_body_temp
client_body_buffer_size 128k;
# 請(qǐng)求的數(shù)據(jù)的臨時(shí)目錄,默認(rèn)/tmp ,修改必須保證nginx具有讀寫權(quán)限
# client_body_temp /tmp
# 連接代理服務(wù)器的超時(shí)時(shí)間章办,單位秒
proxy_connect_timeout 75;
# 代理服務(wù)器處理請(qǐng)求的超時(shí)時(shí)間长窄,單位秒
proxy_read_timeout 75;
# 代理服務(wù)器數(shù)據(jù)回傳超時(shí)時(shí)間,單位秒
proxy_send_timeout 75;
# 代理服務(wù)器錯(cuò)誤是否開啟攔截
proxy_intercept_errors on;
# 開啟從后端被代理服務(wù)器的響應(yīng)body緩沖, on|off, 默認(rèn)on
# proxy_buffering on
# Nginx使用該大小申請(qǐng)read_buf纲菌,即大小指定了 upstream header 最大長(zhǎng)度挠日,如果響應(yīng)頭超過了這個(gè)長(zhǎng)度,Nginx會(huì)報(bào)upstream sent too big header錯(cuò)誤翰舌,然后client收到的是502嚣潜。默認(rèn)值:proxy_buffer_size 4k/8k
proxy_buffer_size 4k;
# 設(shè)置存儲(chǔ)被代理服務(wù)器響應(yīng)的body所占用的buffer個(gè)數(shù)和每個(gè)buffer大小。開辟4個(gè)長(zhǎng)度為32k大小的read_buf用來存儲(chǔ)body椅贱,當(dāng)然不是連接建立初始化時(shí)就開辟4個(gè)懂算,而是當(dāng)當(dāng)前buf不夠存響應(yīng)body時(shí)才會(huì)新申請(qǐng)一個(gè)只冻,最多申請(qǐng)4個(gè)buf; 默認(rèn)值:proxy_buffers 256 8k
proxy_buffers 4 32k;
# nginx會(huì)在沒有完全讀完后端響應(yīng)就開始向客戶端傳送數(shù)據(jù),所以它會(huì)劃出一部分busy狀態(tài)的buffer來專門向客戶端傳送數(shù)據(jù)(建議為proxy_buffers中單個(gè)緩沖區(qū)的2倍)计技,然后它繼續(xù)從后端取數(shù)據(jù)喜德。proxy_busy_buffer_size參數(shù)用來設(shè)置處于busy狀態(tài)的buffer有多大。如果完整數(shù)據(jù)大小小于busy_buffer大小垮媒,當(dāng)數(shù)據(jù)傳輸完成后舍悯,馬上傳給客戶端;如果完整數(shù)據(jù)大小不小于busy_buffer大小睡雇,則裝滿busy_buffer后萌衬,馬上傳給客戶端;
proxy_busy_buffers_size 64k;
# 設(shè)置臨時(shí)文件的總大小,默認(rèn)值:proxy_max_temp_file_size 1024m;
proxy_max_temp_file_size
# 同時(shí)寫入臨時(shí)文件的數(shù)據(jù)量的總大小它抱。通常設(shè)置為8k或者16k秕豫。
proxy_temp_file_write_size 64k;
# 定義proxy的臨時(shí)文件存在目錄以及目錄的層級(jí)。語法:proxy_temp_path path [level1 level2 level3]观蓄,默認(rèn)值proxy_temp_path proxy_temp
# proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
# 設(shè)定負(fù)載均衡后臺(tái)服務(wù)器列表混移,service:反向服務(wù)地址 加端口,weight:權(quán)重侮穿,max_fails:失敗多少次 認(rèn)為主機(jī)已掛掉則歌径,踢出,fail_timeout:踢出后重新探測(cè)時(shí)間撮珠,backup:備用服務(wù),max_conns:允許最大連接數(shù)金矛,slow_start:當(dāng)節(jié)點(diǎn)恢復(fù)芯急,不立即加入,down:表示單前的server暫時(shí)不參與負(fù)載.
upstream backend {
# 負(fù)載均衡的分配策略驶俊,ip_hash;|fair;|hash $request_uri; hash_method crc32; 娶耍,默認(rèn)按照輪詢和權(quán)重(weight)
ip_hash;
# 負(fù)載的服務(wù)器ip、端口和一些配置參數(shù)
server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ;
server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
# 指定可用于長(zhǎng)連接的連接數(shù)
# keepalive 16;
}
# 【虛擬主機(jī)配置】 也可以 include /etc/nginx/sites-enabled/*; 通過外部引入
server {
# 監(jiān)聽80端口
listen 80;
# 設(shè)置訪問的域名
server_name host.example.com;
# 設(shè)置主機(jī)的根目錄
root /var/www/html/oaapp;
# 設(shè)置編碼格式
charset utf-8;
# 設(shè)定本虛擬主機(jī)的訪問日志
access_log /tmp/host.access.log main;
# 設(shè)定本虛擬主機(jī)的錯(cuò)誤日志
error_log /tmp/host.error.log error;
#對(duì) /proxy 所有做負(fù)載均衡+反向代理
location /proxy{
# 匹配路 由根目錄
root /var/www/html/oaapp;
# 入口文件
index index index.php index.jsp index.html index.htm;
# 請(qǐng)求轉(zhuǎn)向backend定義的服務(wù)器列表饼酿,即反向代理
proxy_pass http://backend;
# 語法:proxy_redirect [ default|off|redirect replacement ] 默認(rèn)值:proxy_redirect default 使用字段:http, server, location
# proxy_redirect off;
# 后端的Web服務(wù)器可以通過X-Forwarded-For獲取用戶真實(shí)IP
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
# 這.php文件的處理交給php-fpm
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
# 設(shè)置404狀態(tài)的重定向頁面榕酒,可以指定本地也可以是遠(yuǎn)程url
error_page 404 /404.html;
location = /404.html {
access_log logs/access.log maintry;
proxy_pass http://192.168.10.100:8080/error404.php;
}
# 設(shè)置50x錯(cuò)誤的重定向頁面,可以指定本地也可以是遠(yuǎn)程url
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
}
}