主頁 > 後端開發 > Web服務器之Nginx

Web服務器之Nginx

2020-09-12 11:59:26 後端開發

Nginx基本概念

什么是Nginx

Nginx是一個高性能的HTTP和反向代理web服務器,特點是占有記憶體少,并發能力強,有報告表明能支持高達50000個并發連接數,

正向代理

是一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容回傳給客戶端,客戶端才能使用正向代理,

 

反向代理

反向代理服務器位于用戶與目標服務器之間,但是對于用戶而言,反向代理服務器就相當于目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源,同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定,反向代理服務器通常可用來作為Web加速,即使用反向代理作為Web服務器的前置機來降低網路和服務器的負載,提高訪問效率,

 

負載均衡

Load balancing,即負載均衡,是一種計算機技術,用來在多個計算機(計算機集群)、網路連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化回應時間、同時避免過載的目的,

 

動靜分離

 

 

安裝Nginx

  1.  安裝依賴包

    1 yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel

     

  2. 下載Nginx穩定版
    1 wget http://nginx.org/download/nginx-1.18.0.tar.gz 

     

  3. 解壓、編譯、安裝
     1 # 解壓
     2 tar -zxvf nginx-1.18.0.tar.gz
     3 
     4 # 進入解壓好的檔案
     5 cd nginx-1.18.0/
     6 
     7 # 編譯
     8 ./configure  --prefix=/usr/local/nginx
     9 
    10 # 安裝
    11 make && make install

     

  4. 開放Linux對外網訪問的80埠
    1 /sbin/iptables -I INPUT  -p tcp --dport 80 -j ACCEPT 

     

  5. Nginx服務的啟動操作
    1 ##### 啟動方式二選一 #####
    2 
    3 # 默認組態檔啟動
    4 cd /usr/local/nginx/sbin
    5 ./nginx 
    6 
    7 # 指定組態檔啟動
    8 ./nginx -c  /usr/local/nginx/conf/nginx.conf

     

  6. 驗證
    1 http://公網ip/

     

Nginx常用命令

使用Nginx操作命令前提條件:必須進入到Nginx的目錄 /usr/local/nginx/sbin ,

作用 命令
查看nginx版本  ./nginx -v 
啟動nginx  ./nginx 
關閉nginx  ./nginx -s stop 
重新加載nginx  ./nginx -s reload 

 

Nginx組態檔

組態檔的位置

 /usr/local/nginx/conf/nginx.conf 

 

組態檔的結構

 1 ...              #全域塊
 2 
 3 events {         #events塊
 4    ...
 5 }
 6 
 7 http      #http塊
 8 {
 9     ...   #http全域塊
10     server        #server塊
11     { 
12         ...       #server全域塊
13         location [PATTERN]   #location塊
14         {
15             ...
16         }
17         location [PATTERN] 
18         {
19             ...
20         }
21     }
22     server
23     {
24       ...
25     }
26     ...     #http全域塊
27 }

 

  • 全域塊:配置影響nginx全域的指令,一般有運行nginx服務器的用戶組,nginx行程pid存放路徑,日志存放路徑,組態檔引入,允許生成worker process數等,
  • events塊:配置影響nginx服務器或與用戶的網路連接,有每個行程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網路連接序列化等,
  • http塊:可以嵌套多個server,配置代理,快取,日志定義等絕大多數功能和第三方模塊的配置,如檔案引入,mime-type定義,日志自定義,是否使用sendfile傳輸檔案,連接超時時間,單連接請求數等,
  • server塊:配置虛擬主機的相關引數,一個http中可以有多個server,
  • location塊:配置請求的路由,以及各種頁面的處理情況,

 

組態檔詳解

 1 ########### 每個指令必須有分號結束,#################
 2 #user administrator administrators;  #配置用戶或者組,默認為nobody nobody,
 3 #worker_processes 2;  #允許生成的行程數,默認為1
 4 #pid /nginx/pid/nginx.pid;   #指定nginx行程運行檔案存放地址
 5 error_log log/error.log debug;  #制定日志路徑,級別,這個設定可以放入全域塊,http塊,server塊,級別以此為:debug|info|notice|warn|error|crit|alert|emerg
 6 events {
 7     accept_mutex on;   #設定網路連接序列化,防止驚群現象發生,默認為on
 8     multi_accept on;  #設定一個行程是否同時接受多個網路連接,默認為off
 9     #use epoll;      #事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
10     worker_connections  1024;    #最大連接數,默認為512
11 }
12 http {
13     include       mime.types;   #檔案擴展名與檔案型別映射表
14     default_type  application/octet-stream; #默認檔案型別,默認為text/plain
15     #access_log off; #取消服務日志    
16     log_format myFormat '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式
17     access_log log/access.log myFormat;  #combined為日志格式的默認值
18     sendfile on;   #允許sendfile方式傳輸檔案,默認為off,可以在http塊,server塊,location塊,
19     sendfile_max_chunk 100k;  #每個行程每次呼叫傳輸數量不能大于設定的值,默認為0,即不設上限,
20     keepalive_timeout 65;  #連接超時時間,默認為75s,可以在http,server,location塊,
21 
22     upstream mysvr {   
23       server 127.0.0.1:7878;
24       server 192.168.10.121:3333 backup;  #熱備
25     }
26     error_page 404 https://www.baidu.com; #錯誤頁
27     server {
28         keepalive_requests 120; #單連接請求上限次數,
29         listen       4545;   #監聽埠
30         server_name  127.0.0.1;   #監聽地址       
31         location  ~*^.+$ {       #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫,
32            #root path;  #根目錄
33            #index vv.txt;  #設定默認頁
34            proxy_pass  http://mysvr;  #請求轉向mysvr 定義的服務器串列
35            deny 127.0.0.1;  #拒絕的ip
36            allow 172.18.5.54; #允許的ip           
37         } 
38     }
39 }

 

Nginx配置反向代理

方式一

只替換域名

 1 upstream domain {
 2   server localhost:8080 weight=5;
 3 }
 4  
 5 server {
 6     listen              80;
 7     server_name         test.com;
 8     access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;
 9     location / {
10         proxy_set_header Host $host;
11         proxy_set_header  X-Real-IP        $remote_addr;
12         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
13         proxy_set_header X-NginX-Proxy true;
14         proxy_pass http://domain;
15     }
16  }

 

方式二

帶前綴訪問

 1 upstream prod {
 2   server localhost:8081 weight=5;
 3 }
 4 upstream user {
 5   server localhost:8082 weight=5;
 6 }
 7  
 8 server {
 9     listen              80;
10     server_name         test.com;
11     access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;
12     location ^~/prod/ {
13         proxy_set_header Host $host;
14         proxy_set_header  X-Real-IP        $remote_addr;
15         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
16         proxy_set_header X-NginX-Proxy true;
17         proxy_pass http://prod/;
18     }
19     location ^~/user/ {
20         proxy_set_header Host $host;
21         proxy_set_header  X-Real-IP        $remote_addr;
22         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
23         proxy_set_header X-NginX-Proxy true;
24         proxy_pass http://user/;
25     }
26  
27 }

 

方式三

rewrite重寫URL

 1 upstream prod {
 2   server localhost:8081 weight=5;
 3 }
 4 upstream user {
 5   server localhost:8082 weight=5;
 6 }
 7  
 8 server {
 9     listen              80;
10     server_name         test.com;
11     access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;
12     location ^~/prod/ {
13         proxy_set_header Host $host;
14         proxy_set_header  X-Real-IP        $remote_addr;
15         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
16         proxy_set_header X-NginX-Proxy true;
17         rewrite ^/prod/(.*)$ /$1 break;
18         proxy_pass http://prod;
19     }
20     location ^~/user/ {
21         proxy_set_header Host $host;
22         proxy_set_header  X-Real-IP        $remote_addr;
23         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
24         proxy_set_header X-NginX-Proxy true;
25         rewrite ^/user/(.*)$ /$1 break;
26         proxy_pass http://user;
27     }
28 }

 

Nginx配置負載均衡

配置

 1 http {
 2     upstream upstream_name{
 3         server 192.168.0.28:8001;
 4         server 192.168.0.28:8002;
 5     }
 6 
 7     server {
 8         listen       8080;
 9         server_name  localhost;
10 
11         location / {
12             proxy_pass http://upstream_name;
13             proxy_set_header Host $host;
14             proxy_set_header X-Real-IP $remote_addr;
15             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
16         }
17     }
18 }

 

負載均衡策略

策略一:輪詢(默認)

最基本的配置方法,它是upstream的默認策略,每個請求會按時間順序逐一分配到不同的后端服務器,

引數 描述
fail_timeout 與max_fails結合使用,
max_fails 設定在fail_timeout引數設定的時間內最大失敗次數,如果在這個時間內,所有針對該服務器的請求都失敗了,那么認為該服務器會被認為是停機了,
fail_time 服務器會被認為停機的時間長度,默認為10s,
backup 標記該服務器為備用服務器,當主服務器停止時,請求會被發送到它這里,
down 標記服務器永久停機了,

注意:

  • 在輪詢中,如果服務器down掉了,會自動剔除該服務器,
  • 預設配置就是輪詢策略,
  • 此策略適合服務器配置相當,無狀態且短平快的服務使用,

 

策略二:權重

在輪詢策略的基礎上制定淪陷的幾率,

如:

1 upstream foo {
2     server localhost:8001 weight=2;
3     server localhost:8002;
4     server localhost:8003 backup;
5     server localhost:8004 max_fails=3 fail_timeout=20s;
6 }

 

這里例子中,weight引數用于制定輪詢的幾率,weight默認值為1;weight的數值和被訪問的幾率成正比,

注意:

  • 權重越高分配到需要處理的請求越多,
  • 此策略可以與least_conn和ip_hash結合使用,
  • 此策略比較適合服務器的硬體配置差別比較大的情況,

 

策略三:ip_hash

負載均衡器按照客戶端IP地址的分配方式,可以確保相同客戶端的請求一直發送到相同的服務器,這樣每個訪客都固定訪問一個后端服務器,

1 upstream foo {
2     ip_hash;
3     server localhost:8001 weight=2;
4     server localhost:8002;
5     server localhost:8003;
6     server localhost:8004 max_fails=3 fail_timeout=20s;
7 }

 

注意:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用權重(weight),
  • ip_hash不能與backup同時使用,
  • 此策略適合有狀態服務,比如session,
  • 當有服務器需要剔除,必須手動down掉,

 

策略四:least_conn最小連接

把請求轉發給連接數較少的后端服務器,輪詢演算法是把請求平均的轉發給各個后端,使它們的負載大致相同;但是,有些請求占用的時間很長,會導致其所在的后端負載較高,這種情況下,least_conn這種方式就可以達到更好的負載均衡效果,

1 upstream foo {
2     least_conn;
3     server localhost:8001 weight=2;
4     server localhost:8002;
5     server localhost:8003 backup;
6     server localhost:8004 max_fails=3 fail_timeout=20s;
7 }

注意:

  • 此負載均衡策略適合請求處理時間長短不一造成服務器過載的情況,

 

Nginx配置動靜分離

架構分析

 

配置

動靜分離的原理很簡單,通過location對請求url進行匹配即可,在/Users/Hao/Desktop/Test(任意目錄)下創建 /static/imgs ,

配置如下:

 1 worker_processes  1;
 2 
 3 events {
 4     worker_connections  1024;
 5 }
 6 
 7 http {
 8 
 9    server {
10        listen       10000;
11        server_name  localhost;
12       
13       #攔截后臺請求
14       location / {
15         proxy_pass http://localhost:8888;
16         proxy_set_header X-Real-IP $remote_addr;
17       }
18 
19       #攔截靜態資源
20       location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
21         root /Users/dalaoyang/Downloads/static;
22        }
23 
24     }
25 
26 }

 

 動靜分離與前后分離的區別

  • 動靜分離:動態資源與靜態資源分離,不會部署在同一臺服務器上,
  • 前后分離:網站架構模式,微服務開發基于SOA面向于服務器開發,后臺和前端都采用呼叫介面方式,將一個專案拆分成一個控制Web(前端)和介面(后端),最終使用rpc遠程呼叫技術,視圖層和業務邏輯層拆分,中間采用RPC遠程呼叫技術,

 

常見問題

  • 為什么互聯網公司專案中,靜態資源url后面會加上一個時間戳?
    • 目的:最終的目的是為了控制專案上線的時候,新靜態資源與老的瀏覽器快取靜態資源避免沖突問題,
    • 解決方案:加上時間戳規范t = 專案上線,
  • 304走本地快取狀態碼的原理是什么?
    • 默認瀏覽器圖片快取是7天,
    • 第一次下載資源的時候,客戶端保存修改資源時間,
    • 第二次下載資源的時候,服務端判斷客戶端上一次修改的時間是否需回傳200還是304,
    • 第二次下載資源的時候,服務端判斷當前資源檔案與客戶端上一次修改的時間是否需回傳200還是304客戶端第二次下載資源最后修改時間2018/6/28 下午11:07:11,
    • 服務端最后一次修改時間大于客戶端最后一次修改的時間200重新加載資源,
    • 服務器端最后一次修改的時間小于客戶端最后修改的時間回傳304走本地快取,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13901.html

標籤:Java

上一篇:Java 添加、讀取 Excel 公式

下一篇:快取擊穿 解決方案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more