一、安裝
官網
https://nginx.org/en/download.html
命令
# 下載
wget https://nginx.org/download/nginx-1.14.2.tar.gz
# 解壓
tar -zxvf nginx-1.14.2.tar.gz
# 檢測當前系統環境,以確保能成功安裝nginx
./configure
# 安裝
make&make install
可能會報錯,可以安裝根據提示安裝以下依賴
# 編譯c
yum install gcc-c++
# nginx 的 http 模塊使用 pcre 來解析正則表達式
yum install pcre
yum install pcre-devel
# nginx 使用 zlib 對 http 包的內容進行 gzip
yum install zlib
yum install zlib-devel
# nginx 不僅支持 http 協議,還支持 https(即在ssl協議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫。
yum install openssl
yum install openssl-devel
二、nginx.conf
1、全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,允許生成worker process數等。
# 指定nginx進程使用什麼用戶啓動
user www www;
# 指定啓動多少進程來處理請求,一般情況下設置成CPU的核數。
worker_processes 4;
# 在高併發情況下,通過設置將CPU和具體的進程綁定來降低由於多核CPU切換造成的寄存器等現場重建帶來的性能損耗。
worker_cpu_affinity 0001 0010 0100 1000;
# 定義全局錯誤日誌文件。日誌輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日誌最爲最詳細,而crit輸出日誌最少。
error_log /data/logs/nginx_error.log crit;
# 指定進程pid文件的位置。
pid /usr/local/webserver/nginx/nginx.pid;
# 用於指定一個nginx進程可以打開的最多文件描述符數目,這裏是65535,需要使用命令“ulimit -n 65535”來設置。
worker_rlimit_nofile 65535;
2、events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啓多個網絡連接序列化等。
events{
# use是個事件模塊指令,用來指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。
# 其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中。
# 對於Linux系統,epoll工作模式是首選。在操作系統不支持這些高效模型時才使用select。
use epoll;
# 每一個worker進程能併發處理的最大連接數
worker_connections 1024;
}
3、http塊:可以嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
http{
# include是個主模塊指令,實現對配置文件所包含的文件的設定,可以減少主配置文件的複雜度。
include mime.types;
# default_type屬於HTTP核心模塊指令,這裏設定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式。
default_type application/octet-stream;
# 等待client發送一個請求頭的超時時間,超時後,nginx返回HTTP狀態碼408(“Request timed out”)
client_header_timeout 120s;
# 設置請求體的讀超時時間
client_body_timeout 120s;
# 允許客戶端請求的最大單文件字節數。如果有上傳較大文件,請設置它的限制值。
client_max_body_size 100m;
# 開啓高效文件傳輸模式。
# 對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。
sendfile on;
# 長連接超時時間,單位是秒。
keepalive_timeout 65 :
# 開啓gzip壓縮
gzip on;
# 最小壓縮文件大小
gzip_min_length 1k;
# 壓縮緩衝區
gzip_buffers 4 16k;
# 用於設置識別HTTP協議版本
gzip_http_version 1.1;
# 壓縮等級
gzip_comp_level 6;
# 壓縮類型
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
# vary header支持,該選項可以讓前端的緩存服務器緩存經過GZIP壓縮的頁面。
gzip_vary on;
# Nginx本身不支持PHP等語言,但是它可以通過FastCGI來將請求扔給某些語言或框架處理
# FastCGI相關參數是爲了改善網站的性能:減少資源佔用,提高訪問速度
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;
fastcgi_cache TEST;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
# 限流配置
# $binary_remote_addr(NGINX變量),該變量代表了某個客戶端IP地址的二進制形式。
# zone=關鍵字標識的區域名稱,冒號後面的表示內存區域的大小
# rate表示允許相同標識的客戶端的訪問頻次
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
...
location /login/ {
# burst 設置緩衝區大小,當有大量請求(爆發)過來時,超過了訪問頻次限制的請求可以先放到這個緩衝區內
# nodelay 允許請求在排隊的時候就立即被處理
limit_req zone=mylimit burst=20 nodelay;
...
}
}
# 緩存配置
# proxy_cache_path 設置緩存的路徑和配置
# levels 目錄的層次結構
# keys_zone 設置一個共享內存區
# max_size 緩存的上限
# inactive指定了項目在不被訪問的情況下能夠在內存中保持的時間
# use_temp_path 將寫入緩存的文件先放入一個臨時存儲區域
proxy_cache_path /data/app/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
...
location /article/ {
# 匹配緩存
proxy_cache my_cache;
...
}
}
}
4、upstream塊:配置負載均衡
# 有五種配置方式
# 1、輪詢
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
# 2、weight
upstream backend {
server 192.168.1.1:8080 weight=1;
server 192.168.1.2:8080 weight=2;
}
# 3、ip_hash 按照訪問ip(即Nginx的前置服務器或者客戶端IP)的hash結果分配
upstream backend {
ip_hash;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
# 4、fair 響應時間短即rt小的後端服務器優先分配請求
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
fair;
}
# 5、url_hash 按照訪問url的hash結果來分配請求,使得每個url定向到同一個後端服務器
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
hash $request_uri;
hash_method crc32;
}
# upstream中server指令語法如下:
server address [parameters]
# parameters是可選參數,可以是如下參數:
# 1、down:表示當前server已停用
# 2、backup:表示當前server是備用服務器,只有其它非backup後端服務器都掛掉了或者很忙纔會分配到請求。
# 3、weight:表示當前server負載權重,權重越大被請求機率越大。默認是1.
# 4、max_fails和fail_timeout一般會關聯使用,如果某臺server在fail_timeout時間內出現了max_fails次連接失敗,
# 那麼Nginx會認爲其已經掛掉了,從而在fail_timeout時間內不再去請求它,fail_timeout默認是10s,max_fails默認是1,
# 即默認情況是隻要發生錯誤就認爲服務器掛掉了,如果將max_fails設置爲0,則表示取消這項檢查。
5、server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
# 監聽端口
listen 80;
# 服務器名,可以通過正則匹配
server_name blog.lazyrabbit.xyz;
# 定義服務器的默認網站根目錄位置
root /data/htdocs/www;
# 定義路徑下默認訪問的文件名
index index.html index.htm index.php;
6、location塊:配置請求的路由,以及各種頁面的處理情況。
# location匹配規則
# = 精確匹配,如果找到匹配=號的內容,立即停止搜索,並立即處理請求(優先級最高)
# ~ 區分大小寫
# ~* 不區分大小寫
# ^~ 只匹配字符串,不匹配正則表達式
location / {
# 代理轉發
proxy_pass http://backend;
# 是將代理服務器收到的用戶的信息傳到真實服務器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允許訪問的ip
allow 219.237.222.30;
#禁止其他ip訪問
deny all;
}
# 實現動靜分離
location /img/ {
proxy_pass http://backend;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
#客戶端緩存30天
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 1h;
}
三、一個完整的配置,包括反向代理,動靜分離,負載均衡,緩存,限流。
worker_processes 1;
error_log logs/error.log;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_header_timeout 120s;
client_body_timeout 120s;
# 限制上傳文件大小
client_max_body_size 100m;
# 開啓gzip壓縮
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
# 負載均衡
upstream blog{
server 123.123.123.123:8080;
server 123.123.123.123:8081;
}
# 限流配置
# $binary_remote_addr(NGINX變量),該變量代表了某個客戶端IP地址的二進制形式。
# zone=關鍵字標識的區域名稱,冒號後面的表示內存區域的大小
# rate表示允許相同標識的客戶端的訪問頻次
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
# 靜態html服務器
server {
listen 80;
server_name www.lazyrabbit.xyz lazyrabbit.xyz;
root html/home;
index index.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 反向代理服務器
server {
listen 80;
# 配置二級域名
server_name blog.lazyrabbit.xyz;
location / {
proxy_pass http://blog;
# 將代理服務器收到的用戶的信息傳到真實服務器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# login限流
location /login/ {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://blog;
# 是將代理服務器收到的用戶的信息傳到真實服務器上
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 動靜分離
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)${
root /data/app/nginx/;
# 瀏覽器緩存
expires 7d;
}
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
四、nginx全局變量
$args:這個變量等於請求行中的參數,同$query_string。
$is_args: 如果已經設置$args,則該變量的值爲"?",否則爲""。
$content_length: 請求頭中的Content-length字段。
$content_type: 請求頭中的Content-Type字段。
$document_uri: 與$uri相同。
$document_root: 當前請求在root指令中指定的值。
$host: 請求主機頭字段,否則爲服務器名稱。
$http_user_agent: 客戶端agent信息。
$http_cookie: 客戶端cookie信息。
$limit_rate: 這個變量可以限制連接速率。
$request_method: 客戶端請求的動作,通常爲GET或POST。
$remote_addr: 客戶端的IP地址。
$remote_port: 客戶端的端口。
$remote_user: 已經經過Auth Basic Module驗證的用戶名。
$request_body_file`: 客戶端請求主體的臨時文件名。
$request_uri: 請求的URI,帶參數
$request_filename: 當前請求的文件路徑,由root或alias指令與URI請求生成。
$scheme: 所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;。
$server_protocol: 請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
$server_addr: 服務器地址,在完成一次系統調用後可以確定這個值。
$server_name: 服務器名稱。
$server_port: 請求到達服務器的端口號。
$request_uri: 包含請求參數的原始URI,不包含主機名,如:/foo/bar.php?arg=baz。
$uri: 不帶請求參數的當前URI,$uri不包含主機名,如/foo/bar.html可能和最初的值有不同,比如經過重定向之類的。
五、參考
https://www.cnblogs.com/devinzhang/p/7735397.html
https://www.cnblogs.com/biglittleant/tag/nginx/
https://blog.csdn.net/weixin_38111957/article/details/81210699