Nginx應用詳解及配置

来源:https://www.cnblogs.com/omgasw/archive/2019/05/14/10862107.html
-Advertisement-
Play Games

一、Nginx簡介 概述:Nginx是一款由俄羅斯開發的開源的高性能HTTP伺服器和反向代理伺服器,同時支持IMAP/POP3/SMTP代理服務,其性能優勢著為顯著,官網上稱:單台nginx伺服器可以處理50000併發; 特點:高性能、穩定、消耗硬體資源小、能夠處理大併發,主要用於靜態的解析,動靜頁 ...


、Nginx簡介

概述:Nginx是一款由俄羅斯開發的開源的高性能HTTP伺服器和反向代理伺服器,同時支持IMAP/POP3/SMTP代理服務,其性能優勢著為顯著,官網上稱:單台nginx伺服器可以處理50000併發;

特點:高性能、穩定、消耗硬體資源小、能夠處理大併發,主要用於靜態的解析,動靜頁面的分離;

功能:

  1.作為Web伺服器,nginx處理靜態文件、索引文件以及自動索引效率非常高。

  2.作為代理伺服器,Nginx可以實現無緩存的反向代理加速,提高網站運行速度。

  3.作為負載均衡伺服器,Nginx既可以在內部直接支持Rails和PHP,也可以支持HTTP代理伺服器,對外進行服務。同時支持簡單的容錯和利用演算法進行負載均衡。

優勢:

  1.在性能方面,Nginx在實現上非常註重效率。它採用內核Poll模型,可以支持更多的併發連接,最大可以支持對50 000個併發連接數的響應,而且占用很低的記憶體資源。

  2.在穩定性方面,Nginx採取了分階段資源分配技術,使得對CPU與記憶體的占用率非常低。Nginx官方表示Nginx保持10 000個沒有活動的連接,這些連接只占2.5M記憶體,因此,類似DOS這樣的攻擊對Nginx來說基本上是沒有任何作用的。

  3.在高可用性方面,Nginx支持熱部署,啟動速度特別迅速,因此可以在不間斷服務的情況下,對軟體版本或者配置進行升級,即使運行數月也無需重新啟動,幾乎可以做到7*24小時的不間斷運行。

二、Nginx實現原理

Nginx核心組件

  核心模塊:HTTP模塊、EVENT事件模塊、MAIL模塊。

  基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊、HTTP Rewrite模塊

  第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊、HTTP Access Key模塊。

Nginx模塊分類(基於功能):

  Handlers:處理器模塊,此類模塊直接處理請求,併進行輸出內容和修改headers信息等操作。Handlers處理器模塊一般只能有一個。

  Filters:過濾器模塊,此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由Nginx輸出。

  Proxies:代理類模塊,此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務比如FastCGI等進行交互,實現服務代理和負載均衡等功能。

Nginx的進程模型:

  單工作進程模式:除主進程外,還有一個工作進程,工作進程是單線程的,預設為此模式;

  多工作進程模式:每個工作進程包含多個線程;

master進程: 

1.接收外界傳遞給Nginx的信號,進而管理服務的狀態等;

2.管理worker進程,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程異常情況下退出後,會自動重新啟動新的worker進程;

3.master進程充當整個進程組與用戶的交互介面,同時對進程進行監護。它不需要處理網路事件,不負責業務的執行,只會通過管理worker進程來實現重啟服務、平滑升級、更換日誌文件、配置文件實時生效等功能。

worker進程:

1.處理基本的網路事件,多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。

2.一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。

3.worker進程的個數是可以設置的,一般我們會設置與機器cpu核心數量一致。

擴展:

http://blog.csdn.net/hguisu/article/details/8930668  ##nginx實現原理

三、Nginx支持高併發的原因

I/O模型之select:

  1.每個連接對應一個描述。select模型受限於 FD_SETSIZE(即進程最大打開的描述符數),linux2.6.35為1024,實際上linux每個進程所能打開描數字的個數僅受限於記憶體大小,然而在設計select的系統調用時,卻是參考FD_SETSIZE的值。可通過重新編譯內核更改此值,但不能根治此問題,對於百萬級的用戶連接請求即便增加相應進程數,仍顯得杯水車薪;

  2.select每次請求都會掃描一個文件描述符的集合,這個集合的大小是作為select第一個參數傳入的值。但是每個進程所能打開文件描述符若是增加了,掃描的效率也將減小;

  3.內核到用戶空間,採用記憶體複製方式傳遞信息,這樣就增加了不必要的複製延遲;

I/O模型之epoll模型:

  1.請求無文件描述字大小限制,僅與記憶體大小相關;

  2.epoll返回時已經明確的知道哪個socket fd發生了什麼事件,不用像select那樣再一個個比對;

  3.內核到用戶空間,採用共用記憶體方式傳遞消息,使用mmap加速內核與用戶空間的消息傳遞;

Apache:Apache 2.2.9之前只支持select模型,2.2.9之後支持epoll模型;

Nginx:支持epoll模型;

四、案例:搭建Nginx網站服務

案例環境:

系統類型 IP地址 主機名 所需軟體 硬體
Centos 6.5 64bit 192.168.100.150 www.linuxfan.cn nginx-1.12.2.tar.gz

記憶體:2G

CPU:8核

 

 

 

 

 

案例步驟:

安裝nginx程式;

優化nginx服務並啟動服務;

客戶端訪問測試;

開啟nginx的狀態監聽模塊;

客戶端訪問nginx的狀態監聽界面;

企業級優化Nginx服務;

訪問測試優化後nginx服務;

安裝webbench壓力測試工具,進行測試nginx性能;

自主學習:Nginx伺服器內核優化;

安裝nginx程式

[root@www ~]# rpm -e httpd --nodeps
[root@www ~]# yum -y install pcre-devel zlib-devel
[root@www ~]# useradd -M -s /sbin/nologin nginx
[root@www ~]# tar zxvf nginx-1.12.2.tar.gz -C /usr/src/
[root@www ~]# cd /usr/src/nginx-1.12.2/
[root@www nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

註解:
--prefix=/usr/local/nginx ##指定安裝位置
--user=nginx --group=nginx ##指定運行服務的用戶和組
--with-http_stub_status_module ##開啟狀態監聽模塊 
--conf-path= ##指向配置文件存放位置
--error-log-path= ##指向錯誤日誌存放位置
--pid-path= ##指向pid文件存放位置 
--with-rtsig_module ##啟用rtsig模塊支持(實時信號)
--with-select_module ##啟用select模塊支持(一種輪詢模式,不推薦在高載環境下使用)禁用:--without-select_module
--with-http_ssl_module ##啟用ngx_http_ssl_module支持(使支持https請求,需已安裝openssl)
--with-http_xslt_module   ##啟用ngx_http_xslt_module支持(過濾轉換XML請求)
--with-http_image_filter_module ##啟用ngx_http_image_filter_module支持(傳輸JPEG/GIF/PNG 圖片的一個過濾器)(預設為不啟用,要用到gd庫)
--with-http_gzip_static_module ##啟用ngx_http_gzip_static_module支持(線上實時壓縮輸出數據流)
--with-http_degradation_module   ##啟用ngx_http_degradation_module支持(允許在記憶體不足的情況下返回204或444碼)
--without-http_access_module ##禁用ngx_http_access_module支持(該模塊提供了一個簡單的基於主機的訪問控制,允許或拒絕基於ip地址)
--without-http_auth_basic_module ##禁用ngx_http_auth_basic_module(該模塊是可以使用用戶名和密碼基於http基本認證方法,來保護你的站點或其部分內容)
---without-http_rewrite_module ##禁用ngx_http_rewrite_module支持(該模塊允許使用正則表達式改變URL)
--without-http_fastcgi_module ##禁用ngx_http_fastcgi_module支持(該模塊允許Nginx 與FastCGI 進程交互,並通過傳遞參數來控制FastCGI 進程工作。)

[root@www nginx-1.12.2]# make &&make install
[root@www nginx-1.12.2]# ls /usr/local/nginx/
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

優化nginx服務並啟動服務

[root@www ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/   ##優化命令執行路徑
[root@www ~]# vi /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 99 20
# description: Nginx Server Control Script
NP="/usr/local/nginx/sbin/nginx"
NPF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
  start)
    $NP;
    if [ $? -eq 0 ]
    then
      echo "nginx is starting!! "
    fi
  ;;
  stop)
    kill -s QUIT $(cat $NPF)
    if [ $? -eq 0 ]
    then
    echo "nginx is stopping!! "
    fi
  ;;
  restart)
    $0 stop
    $0 start
  ;;
  reload)
    kill -s HUP $(cat $NPF)
    if [ $? -eq 0 ]
    then
      echo "nginx config file is reload! "
    fi
  ;;
  *)
    echo "Usage: $0 {start|stop|restart|reload}"
    exit 1
esac
exit 0
[root@www ~]# chmod +x /etc/init.d/nginx
[root@www ~]# chkconfig --add nginx
[root@www ~]# chkconfig nginx on  
[root@www ~]# /etc/init.d/nginx start
nginx is starting!!
[root@www ~]# netstat -utpln |grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3713/nginx

客戶端訪問測試

開啟nginx的狀態監聽模塊

[root@www ~]# vi /usr/local/nginx/conf/nginx.conf   ##編輯配置文件在server中添加如下行:
47    location /status {
48        stub_status on;
49        access_log off;
50    } 
[root@www ~]# /etc/init.d/nginx restart
nginx is stopping!!
nginx is starting!!

客戶端訪問nginx的狀態監聽界面

http://192.168.100.150/status

活動的連接數

已處理的連接數 成功的tcp握手次數 已處理的請求數

企業級優化Nginx服務

[root@www ~]# vi  /usr/local/nginx/conf/nginx.conf
worker_processes 8;
worker_cpu_affinity  00000001  00000010  00000100  00001000  00010000  00100000 01000000  10000000;
error_log  /usr/local/nginx/logs/nginx_error.log  crit;
pid  /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 204800;

events  {
        use epoll;
        worker_connections 204800;
}

http            {
include mime.types;
default_type  application/octet-stream;
charset  utf-8;
server_names_hash_bucket_size  128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;

sendfile  on;
tcp_nopush  on;

keepalive_timeout 60;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
        keys_zone=TEST:10m  inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 8k;
fastcgi_temp_file_write_size 8k;

fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;

open_file_cache max=204800  inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;

tcp_nodelay on;

gzip on;
gzip_min_length  1k;
gzip_buffers    4  16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types  text/plain application/x-javascript text/css application/xml;
gzip_vary on;

log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                                  '$status $body_bytes_sent "$http_referer" '
                                  '"$http_user_agent" $http_x_forwarded_for';

server  {
listen 80;
server_name  www.linuxfan.cn;

location / {
        root /usr/local/nginx/html/;
        index index.html index.htm;
}

location /status        {
        stub_status on;
        access_log off;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$               {
        expires 30d;
}
access_log  /usr/local/nginx/logs/access.log  access;
        }
}
註解:
worker_processes 8; ##設置worker進程數量
worker_cpu_affinity  00000001  00000010  00000100  00001000  00010000  00100000 01000000  10000000; ##設置每個worker進程對應一個cpu的核心
error_log  /usr/local/nginx/logs/nginx_error.log  crit; ##指定錯誤日誌
pid  /usr/local/nginx/logs/nginx.pid; ##指定運行時產生的pid文件
worker_rlimit_nofile 204800; ##指定nginx進程最多能夠打開多少個文件描述符,通常與系統中的ulimit -n保持一致;
 
events  { ##事件區域配置
        use epoll; ##指定處理模型為epoll
        worker_connections 204800; ##每個進程最多能夠處理多少個連接
}
 
http            { ##http服務配置區域
include mime.types; ##指定文件擴展名和文件類型映射表
default_type  application/octet-stream; ##指定文件類型
charset  utf-8; ##指定字元集
server_names_hash_bucket_size  128; ##伺服器名字的hash表大小
client_header_buffer_size 2k; ##客戶端請求頭部buffer大小
large_client_header_buffers 4 4k; ##指定客戶端請求中較大的消息頭的緩存數量和大小
client_max_body_size 8m; ##指定客戶端請求的單個文件的最大位元組數
 
sendfile  on; ##開啟高效傳輸模式
tcp_nopush  on; ##防止網路阻塞
 
keepalive_timeout 60; ##客戶端連接超時時間
 
#FastCGI相關參數是為了改善網站的性能:減少資源占用,提高訪問速度。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 ##配置fastcgi緩存路徑和目錄結構等級
        keys_zone=TEST:10m  inactive=5m; ##關鍵字區域存儲時間和非活動刪除時間
fastcgi_connect_timeout 300; ##連接到後端FastCGI的超時時間
fastcgi_send_timeout 300; ##向FastCGI傳送請求的超時時間
fastcgi_read_timeout 300; ##接收FastCGI應答的超時時間
fastcgi_buffer_size 4k; ##指定讀取FastCGI應答第一部分需要多大的緩衝區
fastcgi_buffers 8 4k; ##指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求
fastcgi_busy_buffers_size 8k; ##通常為fastcgi_buffer_size大小的兩倍
fastcgi_temp_file_write_size 8k; ##寫入緩存文件時使用多大的數據塊,大小同上
 
fastcgi_cache TEST; ##開啟Fastcgi的緩存並且為其指定一個名稱
fastcgi_cache_valid 200 302 1h; ##指定不同的狀態碼,其緩存的時間
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1; ##URL經過被訪問多少次將被緩存
fastcgi_cache_use_stale error timeout invalid_header http_500; ##指定什麼情況下不進行緩存
 
open_file_cache max=204800  inactive=20s; ##指定緩存文件最大數量,經過多長時間文件沒有被請求後則刪除緩存,
open_file_cache_min_uses 1; ##指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件更改信息一直是在緩存中打開的;
open_file_cache_valid 30s; ##指定多長時間檢查一次緩存的有效信息,檢查該緩存的源文件是否發生變化修改等;
 
tcp_nodelay on; ## nagle演算法,有需要發送的就立即發送,連接轉換為長連接時使用;
 
gzip on; ##開啟gzip壓縮
gzip_min_length  1k; ##指定最小壓縮文件的大小
gzip_buffers    4  16k; ##指定壓縮緩衝區的個數和大小
gzip_http_version 1.0; ##指定壓縮版本
gzip_comp_level 2; ##指定壓縮等級1-9,9等級最高
gzip_types  text/plain application/x-javascript text/css application/xml; ##指定壓縮文件類型
gzip_vary on; ##前端緩存伺服器緩存經過壓縮的頁面
 
log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                                  '$status $body_bytes_sent "$http_referer" '
                                  '"$http_user_agent" $http_x_forwarded_for';
##配置日誌格式,具體變數表示請結合百度,日誌格式為access
server  {
listen 80;
server_name  www.linuxfan.cn;
 
location / {
        root /usr/local/nginx/html/;
        index index.html index.htm;
}
 
location /status        {
        stub_status on;
        access_log off;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$               {
        expires 30d; ##指定以上格式的文件將進行緩存
}
access_log  /usr/local/nginx/logs/access.log  access;
        }
}
[root@www~]# /etc/init.d/nginx start
nginx: [warn] no "fastcgi_cache_key" for "fastcgi_cache" in /usr/local/nginx/conf/nginx.conf:75
nginx: [warn] no "fastcgi_cache_key" for "fastcgi_cache" in /usr/local/nginx/conf/nginx.conf:75
nginx: [warn] no "fastcgi_cache_key" for "fastcgi_cache" in /usr/local/nginx/conf/nginx.conf:75
nginx is starting!!
[root@www ~]# netstat -utpln |grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3627/nginx
[root@www ~]# ps aux |grep nginx |grep -v grep
root      3627  0.0  0.0  30708   376 ?        Ss   18:59   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx     3628  0.1 11.6 113920 57600 ?        S    18:59   0:00 nginx: worker process      
nginx     3629  0.0 11.1 113920 54932 ?        S    18:59   0:00 nginx: worker process      
nginx     3630  0.0  9.7 113920 48336 ?        S    18:59   0:00 nginx: worker process      
nginx     3631  0.0  9.6 113920 47768 ?        S    18:59   0:00 nginx: worker process      
nginx     3632  0.0  9.8 113920 48516 ?        S    18:59   0:00 nginx: worker process      
nginx     3633  0.0 10.5 113920 52084 ?        S    18:59   0:00 nginx: worker process      
nginx     3634  0.0 11.5 113920 57156 ?        S    18:59   0:00 nginx: worker process      
nginx     3635  0.0  9.4 113920 46892 ?        S    18:59   0:00 nginx: worker process      
nginx     3636  0.0  0.0  30844   392 ?        S    18:59   0:00 nginx: cache manager process

[root@www ~]# top

訪問測試優化後nginx服務

安裝webbench壓力測試工具,進行測試nginx性能

[root@www ~]# yum -y install gcc ctags
[root@www ~]# wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz
[root@www ~]# tar zxvf webbench-1.5.tar.gz -C /usr/src/
[root@www ~]# cd /usr/src/webbench-1.5/
[root@www webbench-1.5]# mkdir /usr/local/man
[root@www webbench-1.5]# make && make install
[root@www webbench-1.5]# cd
[root@www~]# webbench -c 10000 -t 5 http://www.linuxfan.cn:80/index.html ##併發數為10000,時間為5秒
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
 
Benchmarking: GET http://www.linuxfan.cn:80/index.html
10000 clients, running 5 sec.
 
Speed=147744 pages/min, 1397500 bytes/sec.
Requests: 12312 susceed, 0 failed.
[root@www ~]# netstat -nat | awk '/^tcp/ {++S[$NF]} END {for(key in S) print key,"\t",S[key]}' ##查看資料庫狀態
TIME_WAIT  15961 ##表示收到了對方的FIN報文,併發送出了ACK報文
FIN_WAIT1  166 ##已發送FIN報文,等待對方的ACK
SYN_SENT  189 ##這個狀態與SYN_RCVD遙相呼應,用於建立連接 
FIN_WAIT2  1 ##半關閉狀態
ESTABLISHED  1343 ##已經建立連接
SYN_RECV  256 ##已經接收到對方的SYN報文,等待ACK報文
LISTEN  9 ##監聽狀態

瀏覽器訪問監控界面刷新測試

Nginx伺服器內核優化

[root@www ~]# vi /etc/sysctl.conf

[root@www ~]# sysctl -p


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

-Advertisement-
Play Games
更多相關文章
  • Centos7預設安裝時,/boot目錄設置只有150M左右,這樣編譯幾個版本的內核/boot空間就不夠用了。報錯大致如下: 這裡用的方法是:添加一塊硬碟(由於是VM,所以比較方便),添加到VG捲組中,然後新建一個創建一個邏輯捲,將/boot mount到新建的邏輯捲,這樣的話,/boot就可以要多 ...
  • 1、安裝erlang 2、安裝rabbitMQ 3、添加用戶 4、將角色添加到管理員組 5、設置用戶許可權 6、啟用web插件 7、啟動rabbitMQ服務 8、訪問http://192.168.10.10:15672/,如果一切順利的話你會看到如下界面 9、輸入用戶名密碼進入rabbitMQ後臺,你 ...
  • 1、隱藏盤符 打開磁碟管理 -> 對要隱藏的盤符單擊右鍵 -> 更改驅動器號和路徑 -> 刪除。 打開資源管理,已經看不到該盤符,該盤符已被隱藏。只是隱藏,該盤符上的數據仍然還在。 2、顯示被隱藏的盤符 打開磁碟管理 -> 對隱藏的盤符單擊右鍵 -> 更改驅動器號和路徑 -> 添加 -> ok。 打 ...
  • 有時候,我們不能訪問某些網站,而政府又沒有屏蔽這些網站,這可能是功能變數名稱地址解析失敗造成的,我們需要在hosts文件中手動添加功能變數名稱地址對應的IP地址。 1、Windows -> System32 -> drivers -> etc -> hosts,找到hosts文件 2、hosts文件是受系統保護的, ...
  • 環境: centos 7 docker 19.03.0-beta3 192.168.10.10 關於如何安裝docker請參考:https://www.cnblogs.com/caesar-id/p/10857312.html 1、查找合適的版本 2、下載centos鏡像 3、查看本機的鏡像 4、創 ...
  • viw 它的作用是選取一個單詞(word),無論游標在這個單詞的哪個位置都能選中整個單詞。 每日一Vim(18)Text-Object 前兩節講了Visual mode相關內容,這裡提一個小問題,“如何選擇一個單詞?”3秒後...,你可能會使用命令vw,很不幸的是它會把下一個單詞的首字母也選中。如果 ...
  • 案例環境: 一、Nginx隱藏版本號 方式一:修改配置文件 配置版本號隱藏 方式二:修改源碼包 二、網頁緩存、連接超時、網頁壓縮傳輸 1.網頁緩存: 作用:頁面緩存一般針對靜態網頁進行設置,對動態網頁不用設置緩存時間。方便客戶端在日後進行相同內容的請求時直接返回,以避免重覆請求,加快了訪問速度 配置 ...
  • keepalived keepalived: 基於vrrp(虛擬冗餘路由協議)的實現 virtual server: 對於IPVS vrrp_script: 調用外部腳本 nginx haproxy等輕量級的實現 所謂的vrrp就是為瞭解決前端路由器如果發生單點故障導致後方伺服器全部不能與外部通信的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...