nginx的安裝以及配置

一、安裝

官網

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

https://linux.cn/article-5945-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章