NGINX從入門到精通,學會這些就夠了

20200622104645
20200622104645

工做這麼多年一直用的都是NGINX,也一直想寫總結,不過以前都是在上班,下班後就比較懶了,因此一直擱置着,趁着如今離職了有時間,就想把以前欠下的都補上,也算是對本身近年來工做技能的總結,但願這篇文章能幫助到你。php

什麼是nginx

Nginx(發音同「engine X」)是異步框架的網頁服務器,也能夠用做反向代理、負載平衡器和HTTP緩存。該軟件由伊戈爾·賽索耶夫建立並於2004年首次公開發布。2011年成立同名公司以提供支持。2019年3月11日,Nginx公司被F5 Networks以6.7億美圓收購。css

nginx的應用場景

nginx安裝

下載nginx_modules(ps:編譯的時候會用到)
連接: https://pan.baidu.com/s/1MjVdVkF4EAjhPfLImRfWMA 密碼: wwgbhtml

 1#!/usr/bin/env bash
2

3DIR=/Users/shiwenyuan/webserver
4mkdir -p $DIR
5cd $DIR
6mkdir run
7
8tar -zxvf /Users/shiwenyuan/totalXbox/project/phpstorm/xlegal/devops/opbin/nginx_modules.tgz -C $DIR
9
10mkdir tmp
11cd tmp
12
13wget http://nginx.org/download/nginx-1.8.1.tar.gz -O nginx-1.8.1.tar.gz
14
15tar -zxvf nginx-1.8.1.tar.gz
16
17cd nginx-1.8.1
18
19./configure \
20--with-http_realip_module \
21--with-http_stub_status_module \
22--with-http_addition_module \
23--add-module=$DIR/nginx_modules/echo-nginx-module-master \
24--add-module=$DIR/nginx_modules/headers-more-nginx-module-master \
25--add-module=$DIR/nginx_modules/memc-nginx-module-master \
26--add-module=$DIR/nginx_modules/nginx-http-concat-master \
27--add-module=$DIR/nginx_modules/ngx_devel_kit-master \
28--add-module=$DIR/nginx_modules/ngx_http_consistent_hash-master \
29--add-module=$DIR/nginx_modules/ngx_http_enhanced_memcached_module-master \
30--add-module=$DIR/nginx_modules/ngx_http_upstream_ketama_chash-0.6 \
31--add-module=$DIR/nginx_modules/srcache-nginx-module-master \
32--with-pcre=$DIR/nginx_modules/pcre-8.38 \
33--prefix=$DIR
34if [[ $? -ne 0 ]];then
35    echo 'error occured\n'
36    exit 1
37fi
38make && make install
39cd $DIR
40/bin/rm -rf tmp
41/bin/rm -rf node_modules
42
43/sbin/nginx -t
複製代碼

nginx命令行經常使用命令

  • nginx # 啓動nginx
  • nginx -s reload # 向主進程發送信號,從新加載配置文件,熱重啓
  • nginx -s reopen # 重啓 Nginx
  • nginx -s stop # 快速關閉
  • nginx -s quit # 等待工做進程處理完成後關閉
  • nginx -t # 查看當前 Nginx 配置是否有錯誤
  • nginx -t -c <配置路徑> # 檢查配置是否有問題,若是已經在配置目錄,則不須要-c

nginx配置文件詳解

線上應用經常都是一個nginx上面會配置好幾個域名,每一個域名都會放到一個單獨的配置文件裏。而後在nginx.conf中引用這些文件,因此能夠理解爲每次nginx啓動的時候都會默認加載nginx.conf,nginx.conf會把相關的server配置都引用進來造成一個大的nginx文件。node

20200622144019
20200622144019
  • main:全局設置
  • events:配置影響Nginx服務器或與用戶的網絡鏈接
  • http:http模塊設置
  • upstream:負載均衡設置
  • server:http服務器配置,一個http模塊中能夠有多個server模塊
  • location:url匹配配置,一個server模塊中能夠包含多個location模塊

一個nginx配置文件的結構就像nginx.conf顯示的那樣,配置文件的語法規則:nginx

  1. 配置文件由模塊組成
  2. 使用#添加註釋
  3. 使用$使用變量
  4. 使用include引用多個配置文件

nginx與php通訊

訪問路徑

 1www.example.com/index.php
2        |
3        |

4      Nginx
5        |
6        |

7php-fpm監聽127.0.0.1:9000地址
8        |
9        |

10www.example.com/index.php請求轉發到127.0.0.1:9000
11        |
12        |

13nginx的fastcgi模塊將http請求映射爲fastcgi請求
14        |
15        |
 
16  php-fpm監聽fastcgi請求
17        |
18        |
 
19php-fpm接收到請求,並經過worker進程處理請求
20        |
21        |
 
22php-fpm處理完請求,返回給nginx
23        |
24        |
 
複製代碼

nginx與php通訊方式

tcp-socket

tcp socket通訊方式,須要在nginx配置文件中填寫php-fpm運行的ip地址和端口號,該方式支持跨服務器,即nginx和php-fpm再也不統一機器上時。git

1location ~ \.php$ {
2    include fastcgi_params;
3    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
4    fastcgi_pass 127.0.0.1:9000;
5    fastcgi_index index.php;
6}
複製代碼

unix-socket

unix socket通訊方式,須要在nginx配置文件中填寫php-fpm運行的pid文件地址。unix socket又叫IPC(inter process communication進程間通訊)socket,用於實現統一主機上進程間通訊。github

1location ~ \.php$ {
2    include fastcgi_params;
3    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
4    fastcgi_pass unix:/var/run/php5-fpm.sock;
5    fastcgi_index index.php;
6}
複製代碼

二者間的區別

Unix socket 不須要通過網絡協議棧,不須要打包拆包、計算校驗和、維護序號和應答等,只是將應用層數據從一個進程拷貝到另外一個進程。因此其效率比 tcp socket 的方式要高,可減小沒必要要的 tcp 開銷。不過,unix socket 高併發時不穩定,鏈接數爆發時,會產生大量的長時緩存,在沒有面向鏈接協議的支撐下,大數據包可能會直接出錯不返回異常。而 tcp 這樣的面向鏈接的協議,能夠更好的保證通訊的正確性和完整性。web

因此,若是面臨的是高併發業務,則考慮優先使用更可靠的tcp socket,咱們能夠經過負載均衡、內核優化等手段來提供效率。算法

nginx配置動靜分離

什麼是動靜分離

在Web開發中,一般來講,動態資源其實就是指那些後臺資源,而靜態資源就是指HTML,JavaScript,CSS,img等文件。
在使用先後端分離以後,能夠很大程度的提高靜態資源的訪問速度,同時在開過程當中也可讓先後端開發並行能夠有效的提升開發時間,也能夠有些的減小聯調時間 。sql

動靜分離方案

  • 直接使用不一樣的域名,把靜態資源放在獨立的雲服務器上,這個種方案也是目前比較推崇的。
  • 動態請求和靜態文件放在一塊兒,經過nginx配置分開
 1server {
2  location /www/ {
3      root /www/;
4    index index.html index.htm;
5  }
6
7  location /image/ {
8      root /image/;
9  }
10}
複製代碼

nginx配置反向代理

反向代理經常使用與不想把端口暴露出去,直接訪問域名處理請求。

 1server {
2    listen    80;
3    server_name www.phpblog.com.cn;
4    location /swoole/ {
5        proxy_pass http://127.0.0.1:9501;
6    }
7    location /node/ {
8        proxy_pass http://127.0.0.1:9502;
9    }
10
11}
複製代碼

nginx配置負載均衡

 1upstream phpServer{
2    server 127.0.0.1:9501;
3    server 127.0.0.1:9502;
4    server 127.0.0.1:9503;
5}
6server {
7    listen    80;
8    server_name www.phpblog.com.cn;
9    location / {
10        proxy_pass http://phpServer;
11        proxy_redirect     off;
12        proxy_set_header   Host             $host;
13        proxy_set_header   X-Real-IP        $remote_addr;
14        proxy_next_upstream error timeout invalid_header;
15        proxy_max_temp_file_size 0;
16        proxy_connect_timeout      90;
17        proxy_send_timeout         90;
18        proxy_read_timeout         90;
19        proxy_buffer_size          4k;
20        proxy_buffers              4 32k;
21        proxy_busy_buffers_size    64k;
22        proxy_temp_file_write_size 64k;
23    }
24}
複製代碼

常見的負載均衡策略

round-robin/輪詢: 到應用服務器的請求以round-robin/輪詢的方式被分發

1upstream phpServer{
2    server 127.0.0.1:9501 weight=3;
3    server 127.0.0.1:9502;
4    server 127.0.0.1:9503;
5}
複製代碼

在這個配置中,每5個新請求將會以下的在應用實例中分派: 3個請求分派去9501,一個去9502,另一個去9503.

least-connected/最少鏈接:下一個請求將被分派到活動鏈接數量最少的服務器

1upstream phpServer{
2    least_conn;
3    server 127.0.0.1:9501;
4    server 127.0.0.1:9502;
5    server 127.0.0.1:9503;
6}
複製代碼

當某些請求須要更長時間來完成時,最少鏈接能夠更公平的控制應用實例上的負載。

ip-hash/IP散列: 使用hash算法來決定下一個請求要選擇哪一個服務器(基於客戶端IP地址)

1upstream phpServer{
2    ip_hash;
3    server 127.0.0.1:9501;
4    server 127.0.0.1:9502;
5    server 127.0.0.1:9503;
6}
複製代碼

將一個客戶端綁定給某個特定的應用服務器;

nginx配置跨域

因爲瀏覽器同源策略的存在使得一個源中加載來自其它源中資源的行爲受到了限制。即會出現跨域請求禁止。
所謂同源是指:域名、協議、端口相同。

20200622140049
20200622140049
 1server {
2        listen       80;
3        server_name  www.phpblog.com.cn;
4        root   /Users/shiwenyuan/blog/public;
5        index  index.html index.htm index.php;
6        location / {
7            try_files $uri $uri/ /index.php?$query_string;
8        }
9        add_header 'Access-Control-Allow-Origin' "$http_origin";
10        add_header 'Access-Control-Allow-Credentials' 'true';
11        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT, PATCH';
12        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-XSRF-TOKEN';
13
14        location ~ \.php$ {
15            fastcgi_pass   127.0.0.1:9000;
16            fastcgi_index  index.php;
17            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
18            include        fastcgi_params;
19        }
20        error_page  404              /404.html;
21        error_page   500 502 503 504  /50x.html;
22        location = /50x.html {
23            root   html;
24        }
25}
複製代碼
  • Access-Control-Allow-Origin:容許的域名,只能填 *(通配符)或者單域名。
  • Access-Control-Allow-Methods: 容許的方法,多個方法以逗號分隔。
  • Access-Control-Allow-Headers: 容許的頭部,多個方法以逗號分隔。
  • Access-Control-Allow-Credentials: 是否容許發送Cookie。

nginx配置https

此處能夠參考我以前寫的一篇文章
nginx配置https證書認證

nginx僞靜態

應用場景

  • seo優化
  • 安全
  • 流量轉發
1location ^~ /saas {
2    root /home
/work/php/saas/public;
3    index index.php;
4    rewrite ^/saas(/[^\?]*)?((\?.*)?)$ /index.php$1$2 last;
5    break;
6}
複製代碼

平常工做中的奇淫技巧

日誌切割腳本

 1#!/bin/bash
2#設置你的日誌存放的目錄
3log_files_path="/mnt/usr/logs/"
4#日誌以年/月的目錄形式存放
5log_files_dir=${log_files_path}"backup/"
6#設置須要進行日誌分割的日誌文件名稱,多個以空格隔開
7log_files_name=(access.log error.log)
8#設置nginx的安裝路徑
9nginx_sbin="/mnt/usr/sbin/nginx -c /mnt/usr/conf/nginx.conf"
10#Set how long you want to save
11save_days=10
12
13############################################
14#Please do not modify the following script #
15############################################
16mkdir -p $log_files_dir
17
18log_files_num=${#log_files_name[@]}
19#cut nginx log files
20for((i=0;i<$log_files_num;i++));do
21    mv ${log_files_path}${log_files_name[i]} ${log_files_dir}${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d")
22done
23$nginx_sbin -s reload
複製代碼

圖片防盜鏈

 1server {
2  listen       80;        
3  server_name  *.phpblog.com.cn;
4
5  # 圖片防盜鏈
6  location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
7    valid_referers none blocked server_names ~\.google\. ~\.baidu\. *.qq.com;
8    if ($invalid_referer){
9      return 403;
10    }
11  }
12}
複製代碼

nginx訪問控制

1location ~ \.php$ {
2    allow 127.0.0.1;  #只容許127.0.0.1的訪問,其餘均拒絕
3    deny all;
4    fastcgi_pass   127.0.0.1:9000;
5    fastcgi_index  index.php;
6    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
7    include        fastcgi_params;
8}
複製代碼

丟棄不受支持的文件擴展名的請求

1location ~ \.(js|css|sql)$ {
2    deny all;
3}
複製代碼

後話

創做不易,但願對你有所幫助。
若是本篇博客有任何錯誤,請批評指教,不勝感激!!!

原創不易,轉載請註明處。
文章將持續更新中,能夠經過微信搜索[石先生的私房菜]或者下方二維碼關注第一時間閱讀和催更,除了博客之外還會按期發送leetcodephp版題解

20200619155130
20200619155130
相關文章
相關標籤/搜索