nginx的反向代理功能和緩存功能

来源:http://www.cnblogs.com/f-ck-need-u/archive/2017/10/17/7684732.html
-Advertisement-
Play Games

本文目錄:1. nginx的反向代理功能 1.1 正向代理和反向代理 1.2 配置簡單的反代實驗 1.3 使用upstream模塊實現分組反向代理 1.4 ngx_http_proxy_module模塊 1.4.1 指令及其意義 1.4.2 proxy_pass 1.4.3 proxy_set_he ...


本文目錄:
1. nginx的反向代理功能
 1.1 正向代理和反向代理
 1.2 配置簡單的反代實驗
 1.3 使用upstream模塊實現分組反向代理
 1.4 ngx_http_proxy_module模塊
  1.4.1 指令及其意義
  1.4.2 proxy_pass
  1.4.3 proxy_set_header
 1.5 ngx_http_upstream_module模塊
 1.6 反向代理的各種情況
 1.7 nginx代理memcached
2. nginx自帶的緩存功能

1. nginx的反向代理功能

1.1 正向代理和反向代理

正向代理是眾多內網客戶機上網訪問互聯網上的網站時,將所有的請求交給內網前面處於公網上的"管家"伺服器,由"管家"伺服器代為請求想要訪問的web伺服器,然後將得到的結果緩存下來並提供給客戶端,這是正向代理。"管家"伺服器稱為正向代理伺服器。

反向代理是客戶端訪問web伺服器時,請求發送到真實的web伺服器的前端"助手"伺服器上,由"助手"伺服器決定將此請求轉發給哪個真實的web伺服器,外界客戶端以為"助手"伺服器就是真實的web伺服器,而實際上它不是,也不需要安裝任何web程式。"助手"伺服器稱為反向代理伺服器。

nginx是一個優秀的反向代理服務程式,通過反向代理可以實現負載均衡的效果。因為是通過反向代理實現的負載均衡,所以nginx實現的是七層負載均衡。它能夠識別http協議,根據http報文將不同類型的請求轉發到不同的後端web伺服器上。後端的web伺服器稱為"上游伺服器",即upstream伺服器。

實際上,nginx和php-fpm結合的時候,指令fastcgi_pass實現的也是反向代理的功能,只不過這種代理功能是特定的功能,只能轉發給php-fpm。

nginx的反向代理有幾種實現方式:

  1. 僅使用模塊ngx_http_proxy_module實現簡單的反向代理。指令為proxy_pass。
  2. 使用fastcgi模塊提供的功能,反向代理動態內容。指令為fastcgi_pass。
  3. 使用ngx_http_memcached_module模塊提供的功能,反向代理memcached緩存內容,指令為memcached_pass。
  4. 結合upstream模塊實現更人性化的分組反向代理。

1.2 配置簡單的反代實驗

實驗環境如下圖:

反向代理伺服器nginx-proxy(192.168.100.29)的配置。由於是做代理,所以配置文件的location段不再需要root、index等指令,只需幾個和代理相關的指令即可。

server {
    listen       80;
    server_name  www.longshuai.com;
    location ~ \.(png|jpg|jpeg|bmp|gif)$ {
        proxy_pass http://192.168.100.28:80;
    }
    location / {
        proxy_pass http://192.168.100.30:80/;
    }
    location ~ \.(php|php5)$ {
        proxy_pass http://192.168.100.25:80;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

提供動態服務的nginx伺服器(192.168.100.25)的配置如下。

server {
    listen       80;
    server_name  www.longshuai.com;
    location / {
        root    /www/longshuai/;
        index   index.php index.html index.htm;
    }
    location ~ \.php$ {
        root /php/;
        fastcgi_pass    192.168.100.27:9000;
        fastcgi_index   test.php;
        include         fastcgi.conf;
    }
}

其中php-fpm伺服器(192.168.100.27)上的/www/longshuai/index.php內容如下:

<h1>page from php-fpm</h1>
<?php
phpinfo();
?>

LB1(192.168.100.28)和LB2(192.168.100.30)的web程式都是httpd。其中作為一般靜態web伺服器的LB2的配置文件沒有任何修改,它的/var/www/html/index.html的內容如下:

<h1>LB2:static</h1>

作為圖片伺服器的LB1在配置文件中添加瞭如下幾行。且其/var/www/html/下有一個圖片文件a.png。

<Files ~ "\.(png|jpeg|jpg|bmp|gif)">
        Order allow,deny
        Allow from all
</Files>

經過以上的配置,可以實現如下圖的功能。當訪問www.longshuai.com的時候,任意以php結尾的文件請求都轉發給nginx再由nginx交由php-fpm處理;任意以圖片格式結尾(png/jpg/jpeg/bmp/gif)的請求都轉發給LB1;任意非以上兩種格式的請求都轉發給LB2。

重載nginx-proxy/nginx/LB1/LB2上的nginx或者httpd。然後進行測試。

1.3 使用upstream模塊實現分組反向代理

前面只使用了ngx_http_proxy_module來實現反向代理,但是其缺陷在於在nginx-proxy上定義的每條代理規則都只能轉發到後臺的某一臺伺服器上,即後端伺服器無法分組。例如當圖片伺服器壓力太大,添加一臺伺服器想要減輕圖片伺服器壓力,但是僅使用proxy模塊無法實現此類負載均衡到多台圖片伺服器上。

這時需要藉助ngx_http_upstream_module模塊,該模塊用於定義後端伺服器池,後端伺服器也稱為上游伺服器(upstream),可以為每一種類型的後端伺服器分一個組。然後在結合proxy_pass或其他代理指令將相應的請求轉發到池內。

伺服器池可以有多台伺服器,多台伺服器如何實現負載均衡和演算法有關,預設是指定權重的加權均衡演算法,還可以指定ip_hash演算法實現同一個客戶端IP發起的請求總是轉發到同一臺伺服器上。還有一些其它演算法,如最小連接數演算法。最常用的還是加權演算法,然後通過session共用的方式實現同一個客戶端IP發起的請求轉發到同一伺服器上。

例如,下圖描述的需求。當請求圖片伺服器時,可以將請求均衡到IP3和IP4兩台伺服器上,當請求其他靜態內容,可以將請求均衡到IP5和IP6兩台伺服器上。

要實現這樣的功能,nginx-proxy上的nginx配置文件內容大致如下:

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    # define server pool
    upstream dynamic_pool {
        server IP1:80;
    }
    upstream pic_pool {
        server IP3:80 weight=2;
        server IP4:80 weight=1;
    }
    upstream static_pool {
        server IP5:80 weight=1;
        server IP6:80 weight=1;
    }

    server {
        listen 80;
        server_name www.longshuai.com;

        # define how to proxy
        location ~ \.(php|php5)$ {
            proxy_pass http://dynamic_pool;
        }
        location ~ \.(png|jpeg|jpg|bmp|gif)$ {
            proxy_pass http://pic_pool;
        }
        location / {
            proxy_pass http://static_pool;
        }
    }
}

1.4 ngx_http_proxy_module模塊

1.4.1 指令及其意義

該模塊預設安裝。以下是相關指令的說明。

指令指令意義
proxy_pass 定義代理到哪台伺服器或哪個upstream池
proxy_set_header 在代理伺服器上設置http報頭信息。如加上真實客戶端地址"proxy_set_header X_Forwarded_For $remote_addr"
proxy_connect_timeout 反向代理連接上游伺服器節點的超時時間。發起方是proxy方,即等待握手成功的時間
proxy_send_timeout 上游伺服器節點數據傳給代理伺服器的超時時間。即此時間段內,後端節點需要傳完數據給代理伺服器
proxy_read_timeout 定義代理伺服器何時關閉和後端伺服器連接的超時時長,預設為60秒,表示某次後端傳輸完數據給代理伺服器後,如果60秒內代理伺服器和後端伺服器沒有任何傳輸,則關閉此次連接。目的是避免代理伺服器和後端伺服器一直保持連接不斷開而占用資源

1.4.2 proxy_pass

proxy_pass http[s]://{ [IP:PORT/uri/] | upstream_pool };

該指令在前文示例中已經演示過了。此處只說明註意點。

當proxy_pass所在的location中使用了正則匹配時,則proxy_pass(包括fastcgi_pass和memcached_pass)定義的轉發路徑都不能包含任何URI信息。另外,location中使用了尾隨斜線,那麼proxy_pass定義的轉發路徑也必須使用斜線,或者都不加尾隨斜線。

例如下麵的配置方式是允許的。當訪問www.longshuai.com/forum/時將被轉發到http://192.168.100.25:8080/bbs/上。

server_name www.longshuai.com;
location /forum/ {
    proxy_pass http://192.168.100.25:8080/bbs/;
}

而如果使用了正則匹配,將是不允許的。如下。

server_name www.longshuai.com;
location ~ ^/forum/ {
    proxy_pass http://192.168.100.25:8080/bbs/;
}

只能修改轉發路徑使其不包含URI。如下。此時請求www.longshuai.com/forum/將轉發到http://192.168.100.25:8080/forum/。

server_name www.longshuai.com;
location ~ ^/forum/ {
    proxy_pass http://192.168.100.25:8080/;
}

1.4.3 proxy_set_header

可以在nginx配置文件中的http段、server段或location段設置proxy_set_header指令。設置該指令後,傳輸給上游伺服器的報文首部將包含相關的信息,如設置客戶端的真實IP地址。設置如下:

server {
    listen       80;
    server_name  www.longshuai.com;
    location ~ \.(png|jpg|jpeg|bmp|gif)$ {
        proxy_pass http://192.168.100.28:80;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    location / {
        proxy_pass http://192.168.100.30:80/;
        proxy_set_header X-Forwarded-For $remote_addr;

    }
    location ~ \.(php|php5)$ {
        proxy_pass http://192.168.100.25:80;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

僅在代理伺服器上設置了該頭部欄位後還不夠,因為後端伺服器僅僅只是獲取到它,預設並沒有將其記錄下來。所以需要在後端的服務的日誌格式設置上記錄此項或者在其他有需求的地方設置它。nginx的日誌格式和apache的日誌設置格式不同,以下分別是兩種web程式的設置方法:

# nginx上的日誌設置格式
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;

# apache上的日誌設置格式
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

以下是nginx日誌上記錄的信息。

[root@xuexi nginx]# tail -1 logs/access.log 
192.168.100.29 - - [26/Apr/2017:14:35:30 +0800] "GET /index.php HTTP/1.0" 200 76990 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36" "192.168.100.1"

以下是apache日誌中記錄的信息。

[root@xuexi ~]# tail -1 /etc/httpd/logs/access_log
192.168.100.1 192.168.100.29 - - [26/Apr/2017:14:32:52 +0800] "GET /a.png HTTP/1.0" 200 2653 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36"

1.5 ngx_http_upstream_module模塊

upstream模塊定義上游伺服器組。主要的指令有"upstream"、"server"、"ip_hash"。upstream指令必須定義在server段外面。

以下是一個綜合示例定義方法,並非正確,只是放在一起方便比較用法。

upstream backend {
    server 192.168.100.25;
    server 192.168.100.26:80;
    server www.longshuai.com;
    server www.xiaofang.com:8080;
    server 192.168.100.27 weight=2 max_fails=2 fail_timeout=2s;
    server 192.168.100.28 down;
    server 192.168.100.29 backup;
    ip_hash;   # 定義此項後,前面的server附加項weight和backup功能失效。
}

預設使用加權均衡演算法,使用ip_hash指令可設置為ip_hash演算法,但使用ip_hash指令後,如果server指令中使用了weight和backup選項,這兩個功能將會失效。

其中server指令後可以跟的附加選項有:

  • weight:定義該後端伺服器在組中的權重,預設為1,權重越大,代理轉發到此伺服器次數越多。
  • max_fails和fail_timeout:定義代理伺服器聯繫後端伺服器的失敗重聯繫次數和失敗後重試等待時間。預設為1和10,如果設置為2和3,則表示只嘗試聯繫2次,每次失敗等待3秒後進行下一次重試,也就是說6秒後就能判定此後端伺服器無法聯繫上,將負載均衡到下一臺伺服器上。常會配合proxy_next_upstream或者fastcgi_next_upstream或者memcached_next_upstream來指定失敗時如何處理。
  • down:將此後端伺服器定義為離線狀態。此功能不同於直接在配置文件中刪除此伺服器配置或註釋它。常用於ip_hash均衡演算法。當使用ip_hash演算法時,如果某台伺服器壞了需要將其從伺服器組中排除,直接從配置文件中直接刪除該伺服器將會導致此前分配到此後端伺服器的客戶端重新計算IP_HASH值,而使用down則不會。
  • backup:指定當其他非backup的server都聯繫不上時,將返回backup所定義的伺服器內容。常用於顯示sorry page。

當server指定後端伺服器時使用的是主機名的方式時,需要在代理伺服器上添加功能變數名稱解析記錄,如放到/etc/hosts中。

以下是一個配置示例。只定義了一個upstream組,所有請求都代理,權重為2比1,當192.168.100.28和192.168.100.30都斷開聯繫時,將返回代理伺服器本身配置的sorrypage。

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    upstream web_group {
        server 192.168.100.28 weight=2 max_fails=2 fail_timeout=2s;
        server 192.168.100.30 weight=1 max_fails=2 fail_timeout=2s;
        server 127.0.0.1:80 backup;
    }
    server {
        listen 127.0.0.1:80;
        root /www/longshuai/;
        index index.html;
    }
    server {
        listen       80;
        server_name  www.longshuai.com;
        location / {
                proxy_pass http://web_group;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   html;
        }
    }
}

然後在反向代理伺服器上創建/www/longshuai/目錄,並向目錄下的index.html文件中寫入"sorry...."。

mkdir -p /www/longshuai/
echo "<h1>sorry pages...</h1>" >/www/longshuai/index.html

重載代理伺服器。在瀏覽器上輸入www.longshuai.com並不斷刷新,結果應該是2:1的返回權重。再依次測試停掉某一臺後端伺服器和兩台後端都停掉的情況。

1.6 反向代理的各種情況

反向代理時,可以根據uri的尾碼來代理,也可以根據uri中的目錄來代理,還可以根據客戶端瀏覽器類型來代理。例如手機訪問網站時轉發到某個後端伺服器組,IE瀏覽器訪問的轉發到某一個後端伺服器組等。

# uri尾碼代理。
location ~ \.(jpeg|jpg|png|bmp|gif)$ {
    proxy_pass ...
}

# 目錄代理。
location ~ /forum/ {
    proxy_pass ...
}

# 瀏覽器類型代理。
location / {
    if ($http_user_agent ~ "MSIE") {
        proxy_pass...
    }
    if ($http_user_agent ~ "Chrome") {
        proxy_pass...
    }
}

1.7 nginx代理memcached

該模塊可以從將請求代理至memcached server上,並立即從server上獲取響應數據。例如:

location / {
                set $memcached_key "$uri?$args";
                memcached_pass     127.0.0.1:11211;
}

nginx代理memcached時,需要以變數$memcached_key作為key去訪問memcached server上的數據。例如此處將$uri$args變數賦值給$memcached_key變數作為key去訪問memcached伺服器上對應的數據。

但這樣的代理顯然不符合真正的需求:沒有實現memcached的分散式功能。當memcached server宕機時,nginx將無法從中獲取任何數據。所以應該使用上游伺服器組。例如:

upstream memcached {
    server 127.0.0.1:11211;
    server 127.0.0.1:11212;
    server 127.0.0.1:11213;
    server 127.0.0.1:11214;
}

server {
    listen       80;
    server_name  dev.hwtrip.com;

    location ^~ /cache/ {
        set            $memcached_key "$uri$args";
        memcached_pass memcached;

但這也不適合,因為memcached是基於一致性哈希演算法的,而upstream模塊預設並不支持一致性哈希演算法。可以通過upstream模塊的hash指令或者另外使用一個第三方模塊ngx_http_upstream_consistent_hash

如果使用的是upstream模塊的hash指令,配置如下:

upstream memcached {
    hash "$uri$args" consistent;
    server 127.0.0.1:11211;
    server 127.0.0.1:11212;
    server 127.0.0.1:11213;
    server 127.0.0.1:11214;
}

這樣,各上游主機就通過hash一致性的演算法進行負載均衡。

如果使用的是第三方模塊ngx_http_upstream_consistent_hash,則在模塊添加成功後如下配置upstream組:

upstream memcached {
    consistent_hash consistent;
    server 127.0.0.1:11211;
    server 127.0.0.1:11212;
    server 127.0.0.1:11213;
    server 127.0.0.1:11214;
}

2 nginx自帶的緩存功能

nginx的ngx_http_proxy_module自帶了緩存功能。有幾種緩存:網頁內容緩存,日誌緩存,打開文件緩存,fastcgi緩存。fastcgi緩存功能應慎用,因為動態程式的前後邏輯可能改變了,緩存後的結果可能並非實際所需結果。

在說明nginx自帶的緩存功能之前,需說明其缺陷。nginx的緩存功能主要用於緩存體積較小的頁面資源,當數據較大時很容易出現瓶頸。在頁面資源的緩存功能上,它屬於業餘玩家。而squid是科班出身,功能最全面,可以緩存大量數據,但架構太老,性能一般。varnish則是此類緩存的新貴,架構較新,記憶體管理完全交由操作系統內核,性能是squid的幾倍之強,但緩存的內容不足squid

本節所講的主要是nginx自帶緩存的網頁內容緩存。當實現網頁內容緩存時,作為web服務程式,它可以緩存自身返回給客戶端的數據,包括讀取的圖片、文件等;作為代理,它可以緩存來自後端的數據緩存後的數據在記憶體中有,也會放在設定的目錄下。這樣以後客戶端繼續請求相同資源時,可以直接從記憶體中或者自身的磁碟中獲取並返回給客戶端。當緩存超出指定的空間大小時,將會有一個專門的線程cache_manager來清理緩存。

定義的相關指令主要有3個:proxy_cache_path、proxy_cache、proxy_cache_valid。

  • proxy_cache_path:它的語法比較複雜,但用起來很簡單。
    proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
    

其中proxy_cache_path path [levels=levels] keys_zone=name:size [max_size=size]這幾項是一般使用的選項和必需項。以下為一示例。

proxy_cache_path /usr/local/nginx/cache_dir levels=1:2 keys_zone=cache_one:20m max_size=1g;

其中:

  1. path:定義緩存放在磁碟的哪個目錄下。此處表示定義在/usr/local/nginx/cache_dir目錄下。目錄不存在會自動創建。
  2. levels:定義緩存目錄的級別,同時定義緩存目錄名稱的字元數。例如levels=1:2:2表示3級目錄,且第一級目錄名1個字元,第二級目錄2個字元,第三級目錄2個字元。目錄最多3級,目錄名最多為2個字元。例如上例中"levels=1:2"產生的緩存文件路徑可能是這樣的"/usr/local/nginx/cache_dir/d/f1/50a3269acaa7774c02d4da0968124f1d",註意其中加粗的字體。
  3. keys_zone:定義緩存標識名稱和記憶體中緩存的最大空間。name部分必須唯一,在後面會引用name來表示使用該緩存方法。
  4. max_size:定義磁碟中緩存目錄的最大空間。即path定義的文件最大空間。

該指令定義後只是定義了一種緩存方法,並非開啟了緩存。

  • proxy_cache:定義要使用哪個緩存方法。使用proxy_cache_path中的name來引用。

例如引用上例定義的cache_one。

proxy_cache cache_cache;
  • proxy_cache_valid:根據狀態碼來指定緩存有效期。

例如,下麵的表示狀態碼為200和302的狀態緩存1小時,狀態碼為404時即page not found的緩存只有1分鐘,防止客戶端請求一直錯誤,狀態碼為其他的則緩存5分鐘。

proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;

如果不指定狀態碼,只指定時間,則預設只緩存狀態碼200、301、302各5分鐘,其他的狀態碼不緩存。

以下是代理伺服器192.168.100.29上定義的緩存示例。

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

        upstream web_group {
                server 192.168.100.28 weight=2 max_fails=2 fail_timeout=2s;
                server 192.168.100.30 weight=1 max_fails=2 fail_timeout=2s;
                server 127.0.0.1:80 backup;
        }
        proxy_cache_path /usr/local/nginx/cache_dir levels=1:2 keys_zone=cache_one:20m max_size=1g;
        server {
                listen 127.0.0.1:80;
                root /www/longshuai/;
                index index.html;
        }
        server {
                listen       80;
                server_name  www.longshuai.com;
              # 在響應報文中添加緩存首部欄位
                add_header X-Cache "$upstream_cache_status from $server_addr";
                location / {
                        proxy_pass http://web_group;
                        proxy_cache cache_one;
                        proxy_cache_valid 200 1h;
                        proxy_cache_valid 404 1m;
                        proxy_cache_valid any 5m;
                }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

其中添加的一行"add_header X-Cache "$upstream_cache_status from $server_addr";"表示在響應報文的頭部加上一欄位X-Cache,其值為是否命中緩存的狀態($upstream_cache_status),從哪台伺服器上($server_addr)取得的緩存。 重載代理伺服器的配置文件後,在客戶端打開"開發者工具"進行測試。

由於是第一次提供緩存功能,所以結果是未命中緩存。此時已經將緩存保存下來了。 再進行測試,結果將命中緩存是"hit from 192.168.100.29"。

查看緩存目錄。

[root@xuexi nginx]# tree /usr/local/nginx/cache_dir/  
/usr/local/nginx/cache_dir/
├── 3
│   └── 26
│       └── 3abcc5796b407cf3db2716539d256263
└── d
    └── f1
        └── 3b37290aabefe7369a4680875f763f1d

如果想要刪除緩存,只需刪除對應的目錄即可。

回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html

回到資料庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html

轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7684732.html

註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Oracle 中的幾個服務 1.OracleDBConsoleorcl 進程:nmesrvc.exe oem控制台服務進程,dba用。Oracle Enterprise Manager(Oracle企業管理器,簡稱OEM)是通過一組Oracle程式,為管理分散式環境提供了管理服務。OEM包括了一 ...
  • --step 1 : 修改資料庫名稱 USE master GO ALTER DATABASE GeovinDuCms SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO EXEC master..sp_renamedb 'GeovinDuCms','DuCms' ... ...
  • 包含要點: 資料庫的迴圈 、 insert select 句式 、 隨機數(rand()函數)、絕對值(abs()函數) ...
  • Oracle是目前最流行的資料庫之一。功能強大,性能卓越。所以學起來比較困難。學習Oracle需要具備一定的基礎。比如學習過一門編程語言,或者學過其他的資料庫等,沒有一些基礎很難下手。 一、Oracle的簡述 1.目前主流資料庫: SQLServer mysql Access Oracle / DB ...
  • 一、安裝 PostgresSQL Centos 7 自帶的 PostgresSQL 是 9.2 版的。因為,yum 已經做了國內源,速度飛快,所以直接就用 yum 安裝了。依次執行以下命令即可,非常簡單。 如果需要安裝最新的版本,那就按官網上的說明來吧,但那個下載速度實在是…… https://ww ...
  • char、varchar、nchar、nvarchar、text的區別 1.有var首碼的,表示是實際存儲空間是變長的,varchar,nvarchar 所謂定長就是長度固定的,當輸入的數據長度沒有達到指定的長度時將自動以英文空格在其後面填充,使長度達到相應的長度,當你輸入的字元大於指定的數時,它會 ...
  • PreparedStatement 1、 2、 3、 4、 並沒有select ?,? from book的形式,都是值為多少的形式 ...
  • 1.正則中所有的匹配模式,都應該理解為"匹配了某字元或字元串後,緊跟著再匹配"。這個概念很重要。 2.中括弧首部使用脫字元時,表示的是緊跟著匹配不含給定字元的字元,而不是允許不匹配給定的字元。 它們大多數時候是等價的,但在匹配行尾時,意義不同,例如:Aa[^bcd]$ 所匹配的行允許是Aaa$或Aa ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...