主頁 > 後端開發 > 超詳細 Nginx 極簡教程,傻瓜一看也會!

超詳細 Nginx 極簡教程,傻瓜一看也會!

2020-09-30 23:12:16 後端開發

作者:靜默虛空
www.cnblogs.com/jingmoxukong/p/5945200.htm

什么是Nginx?

Nginx (engine x) 是一款輕量級的Web 服務器 、反向代理服務器及電子郵件(IMAP/POP3)代理服務器,

什么是反向代理?

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網路上的服務器,并將從服務器上得到的結果回傳給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器,

安裝與使用

安裝

nginx官網下載地址:http://nginx.org,發布版本分為 Linux 和 windows 版本,

也可以下載原始碼,編譯后運行,

從源代碼編譯 Nginx

把原始碼解壓縮之后,在終端里運行如下命令:

$ ./configure
$ make
$ sudo make install

默認情況下,Nginx 會被安裝在 /usr/local/nginx,通過設定編譯選項,你可以改變這個設定,

Windows 安裝

為了安裝 Nginx / Win32,需先下載它,然后解壓之,然后運行即可,下面以 C 盤根目錄為例說明下:

cd C:
cd C: ginx-0.8.54   start nginx

Nginx / Win32 是運行在一個控制臺程式,而非 windows 服務方式的,服務器方式目前還是開發嘗試中,

使用

nginx 的使用比較簡單,就是幾條命令,

常用到的命令如下:

  • nginx -s stop :快速關閉Nginx,可能不保存相關資訊,并迅速終止web服務,

  • nginx -s quit :平穩關閉Nginx,保存相關資訊,有安排的結束web服務,

  • nginx -s reload :因改變了Nginx相關配置,需要重新加載配置而多載,

  • nginx -s reopen :重新打開日志檔案,

  • nginx -c filename :為 Nginx 指定一個組態檔,來代替預設的,

  • nginx -t :不運行,而僅僅測驗組態檔,nginx 將檢查組態檔的語法的正確性,并嘗試打開組態檔中所參考到的檔案,

  • nginx -v:顯示 nginx 的版本,

  • nginx -V:顯示 nginx 的版本,編譯器版本和配置引數,

如果不想每次都敲命令,可以在nginx安裝目錄下新添一個啟動批處理檔案startup.bat,雙擊即可運行,內容如下:

@echo off
rem 如果啟動前已經啟動nginx并記錄下pid檔案,會kill指定行程
nginx.exe -s stop

rem 測驗組態檔語法正確性
nginx.exe -t -c conf/nginx.conf

rem 顯示版本資訊
nginx.exe -v

rem 按照指定配置去啟動nginx
nginx.exe -c conf/nginx.conf

如果是運行在 Linux 下,寫一個 shell 腳本,大同小異,

nginx 配置實戰

我始終認為,各種開發工具的配置還是結合實戰來講述,會讓人更易理解,

http反向代理配置

我們先實作一個小目標:不考慮復雜的配置,僅僅是完成一個 http 反向代理,

nginx.conf 組態檔如下:

注:conf / nginx.conf 是 nginx 的默認組態檔,你也可以使用 nginx -c 指定你的組態檔

#運行用戶
#user somebody;

#啟動行程,通常設定成和cpu的數量相等
worker_processes  1;

#全域錯誤日志
error_log  D:/Tools/nginx-1.10.1/logs/error.log;
error_log  D:/Tools/nginx-1.10.1/logs/notice.log  notice;
error_log  D:/Tools/nginx-1.10.1/logs/info.log  info;

#PID檔案,記錄當前啟動的nginx的行程ID
pid        D:/Tools/nginx-1.10.1/logs/nginx.pid;

#作業模式及連接數上限
events {
   worker_connections 1024;    #單個后臺worker process行程的最大并發鏈接數
}

#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
   #設定mime型別(郵件支持型別),型別由mime.types檔案定義
   include       D:/Tools/nginx-1.10.1/conf/mime.types;
   default_type  application/octet-stream;

   #設定日志
   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    D:/Tools/nginx-1.10.1/logs/access.log main;
   rewrite_log     on;

   #sendfile 指令指定 nginx 是否呼叫 sendfile 函式(zero copy 方式)來輸出檔案,對于普通應用,
   #必須設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設定為 off,以平衡磁盤與網路I/O處理速度,降低系統的uptime.
   sendfile        on;
   #tcp_nopush     on;

   #連接超時時間
   keepalive_timeout  120;
   tcp_nodelay        on;

   #gzip壓縮開關
   #gzip  on;

   #設定實際的服務器串列
   upstream zp_server1{
       server 127.0.0.1:8089;
   }

   #HTTP服務器
   server {
       #監聽80埠,80埠是知名埠號,用于HTTP協議
       listen       80;

       #定義使用www.xx.com訪問
       server_name  www.javastack.cn;

       #首頁
       index index.html

       #指向webapp的目錄
       root D:_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebapp;

       #編碼格式
       charset utf-8;

       #代理配置引數
       proxy\_connect\_timeout 180;
       proxy\_send\_timeout 180;
       proxy\_read\_timeout 180;
       proxy\_set\_header Host $host;
       proxy\_set\_header X-Forwarder-For $remote_addr;

       #反向代理的路徑(和upstream系結),location 后面設定映射的路徑
       location / {
           proxy_pass http://zp_server1;
       }

       #靜態檔案,nginx自己處理
       location ~ ^/(images|javascript|js|css|flash|media|static)/ {
           root D:_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebappiews;
           #過期30天,靜態檔案不怎么更新,過期可以設大一點,如果頻繁更新,則可以設定得小一點,
           expires 30d;
       }

       #設定查看Nginx狀態的地址
       location /NginxStatus {
           stub_status           on;
           access_log            on;
           auth_basic            "NginxStatus";
           auth\_basic\_user_file  conf/htpasswd;
       }

       #禁止訪問 .htxxx 檔案
       location ~ /.ht {
           deny all;
       }

       #錯誤處理頁面(可選擇性配置)
       #error_page   404              /404.html;
       #error_page   500 502 503 504  /50x.html;
       #location = /50x.html {
       \#    root   html;
       #}
   }
}

好了,讓我們來試試吧:

啟動 webapp,注意啟動系結的埠要和nginx中的 upstream 設定的埠保持一致,

更改 host:

在 C:Windows\System32\drivers\etc 目錄下的host檔案中添加一條DNS 記錄127.0.0.1 www.javastack.cn 啟動前文中 startup.bat 的命令

在瀏覽器中訪問 www.javastack.cn,不出意外,已經可以訪問了,

負載均衡配置

上一個例子中,代理僅僅指向一個服務器,

但是,網站在實際運營程序中,多半都是有多臺服務器運行著同樣的app,這時需要使用負載均衡來分流,

nginx也可以實作簡單的負載均衡功能,

假設這樣一個應用場景:將應用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三臺linux環境的服務器上,網站域名叫 www.javastack.cn,公網IP為 192.168.1.11,在公網IP所在的服務器上部署 nginx,對所有請求做負載均衡處理,

nginx.conf 配置如下:

http {
    #設定mime型別,型別由mime.type檔案定義
   include       /etc/nginx/mime.types;
   default_type  application/octet-stream;
   #設定日志格式
   access_log    /var/log/nginx/access.log;

   #設定負載均衡的服務器串列
   upstream load\_balance\_server {
       #weigth引數表示權值,權值越高被分配到的幾率越大
       server 192.168.1.11:80   weight=5;
       server 192.168.1.12:80   weight=1;
       server 192.168.1.13:80   weight=6;
   }

  #HTTP服務器
  server {
       #偵聽80埠
       listen       80;

       #定義使用www.xx.com訪問
       server_name  www.javastack.cn;

       #對所有請求進行負載均衡請求
       location / {
           root        /root;                 #定義服務器的默認網站根目錄位置
           index       index.html index.htm;  #定義首頁索引檔案的名稱
           proxy_pass  http://load\_balance\_server ;#請求轉向load\_balance\_server 定義的服務器串列

           #以下是一些反向代理的配置(可選擇性配置)
           #proxy_redirect off;
           proxy\_set\_header Host $host;
           proxy\_set\_header X-Real-IP $remote_addr;
           #后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
           proxy\_set\_header X-Forwarded-For $remote_addr;
           proxy\_connect\_timeout 90;          #nginx跟后端服務器連接超時時間(代理連接超時)
           proxy\_send\_timeout 90;             #后端服務器資料回傳時間(代理發送超時)
           proxy\_read\_timeout 90;             #連接成功后,后端服務器回應時間(代理接收超時)
           proxy\_buffer\_size 4k;              #設定代理服務器(nginx)保存用戶頭資訊的緩沖區大小
           proxy_buffers 4 32k;               #proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設定
           proxy\_busy\_buffers_size 64k;       #高負荷下緩沖大小(proxy_buffers*2)
           proxy\_temp\_file\_write\_size 64k;    #設定快取檔案夾大小,大于這個值,將從upstream服務器傳

           client\_max\_body_size 10m;          #允許客戶端請求的最大單檔案位元組數
           client\_body\_buffer_size 128k;      #緩沖區代理緩沖用戶端請求的最大位元組數
       }
   }
}

網站有多個webapp的配置

當一個網站功能越來越豐富時,往往需要將一些功能相對獨立的模塊剝離出來,獨立維護,這樣的話,通常,會有多個 webapp,

舉個例子:假如 www.javastack.cn 站點有好幾個webapp,finance(金融)、product(產品)、admin(用戶中心),訪問這些應用的方式通過背景關系(context)來進行區分:

  • www.javastack.cn/finance/

  • www.javastack.cnproduct/

  • www.javastack.cn/admin/

我們知道,http的默認埠號是80,如果在一臺服務器上同時啟動這3個 webapp 應用,都用80埠,肯定是不成的,所以,這三個應用需要分別系結不同的埠號,

那么,問題來了,用戶在實際訪問 www.javastack.cn 站點時,訪問不同 webapp,總不會還帶著對應的埠號去訪問吧,所以,你再次需要用到反向代理來做處理,

配置也不難,來看看怎么做吧:

http {
   #此處省略一些基本配置

   upstream product_server{
       server www.javastack.cn:8081;
   }

   upstream admin_server{
       server www.javastack.cn:8082;
   }

   upstream finance_server{
       server www.javastack.cn:8083;
   }

   server {
       #此處省略一些基本配置
       #默認指向product的server
       location / {
           proxy_pass http://product_server;
       }

       location /product/{
           proxy_pass http://product_server;
       }

       location /admin/ {
           proxy_pass http://admin_server;
       }

       location /finance/ {
           proxy_pass http://finance_server;
       }
   }
}

https反向代理配置

一些對安全性要求比較高的站點,可能會使用 HTTPS(一種使用ssl通信標準的安全HTTP協議),

這里不科普 HTTP 協議和 SSL 標準,但是,使用 nginx 配置 https 需要知道幾點:

  • HTTPS 的固定埠號是 443,不同于 HTTP 的 80 埠

  • SSL 標準需要引入安全證書,所以在 nginx.conf 中你需要指定證書和它對應的 key

其他和 http 反向代理基本一樣,只是在 Server 部分配置有些不同,

#HTTP服務器
 server {
     #監聽443埠,443為知名埠號,主要用于HTTPS協議
     listen       443 ssl;

     #定義使用www.xx.com訪問
     server_name  www.javastack.cn;

     #ssl證書檔案位置(常見證書檔案格式為:crt/pem)
     ssl_certificate      cert.pem;
     #ssl證書key位置
     ssl\_certificate\_key  cert.key;

     #ssl配置引數(選擇性配置)
     ssl\_session\_cache    shared:SSL:1m;
     ssl\_session\_timeout  5m;
     #數字簽名,此處使用MD5
     ssl_ciphers  HIGH:!aNULL:!MD5;
     ssl\_prefer\_server_ciphers  on;

     location / {
         root   /root;
         index  index.html index.htm;
     }
 }

靜態站點配置

有時候,我們需要配置靜態站點(即 html 檔案和一堆靜態資源),

舉例來說:如果所有的靜態資源都放在了 /app/dist 目錄下,我們只需要在 nginx.conf 中指定首頁以及這個站點的 host 即可,

配置如下:

worker_processes  1;

events {
   worker_connections  1024;
}

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

   gzip on;
   gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png;
   gzip_vary on;

   server {
       listen       80;
       server_name  static.zp.cn;

       location / {
           root /app/dist;
           index index.html;
           #轉發任何請求到 index.html
       }
   }
}

然后,添加 HOST:

127.0.0.1 static.zp.cn,此時,在本地瀏覽器訪問 static.zp.cn ,就可以訪問靜態站點了,

跨域解決方案

web 領域開發中,經常采用前后端分離模式,這種模式下,前端和后端分別是獨立的 web 應用程式,例如:后端是 Java 程式,前端是 React 或 Vue 應用,更多請看這篇文章《到底什么是跨域,及解決方案》,

各自獨立的 web app 在互相訪問時,勢必存在跨域問題,解決跨域問題一般有兩種思路:

CORS

在后端服務器設定 HTTP 回應頭,把你需要運行訪問的域名加入加入 Access-Control-Allow-Origin 中,

jsonp

把后端根據請求,構造json資料,并回傳,前端用 jsonp 跨域,

這兩種思路,本文不展開討論,

需要說明的是,nginx 根據第一種思路,也提供了一種解決跨域的解決方案,

舉例:www.javastack.cn 網站是由一個前端 app ,一個后端 app 組成的,前端埠號為 9000, 后端埠號為 8080,

前端和后端如果使用 http 進行互動時,請求會被拒絕,因為存在跨域問題,來看看,nginx 是怎么解決的吧:

首先,在 enable-cors.conf 檔案中設定 cors :

# allow origin list
set $ACAO '*';

# set single origin
if ($http_origin ~\* (www.javastack.cn)$) {
 set $ACAO $http_origin;
}

if ($cors = "trueget") {
   add_header 'Access-Control-Allow-Origin' "$http_origin";
   add_header 'Access-Control-Allow-Credentials' 'true';
   add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
   add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}

if ($request_method = 'OPTIONS') {
 set $cors "${cors}options";
}

if ($request_method = 'GET') {
 set $cors "${cors}get";
}

if ($request_method = 'POST') {
 set $cors "${cors}post";
}

接下來,在你的服務器中 include enable-cors.conf 來引入跨域配置:

# ----------------------------------------------------
# 此檔案為專案 nginx 配置片段
# 可以直接在 nginx config 中 include(推薦)
# 或者 copy 到現有 nginx 中,自行配置
# www.javastack.com 域名需配合 dns hosts 進行配置
# 其中,api 開啟了 cors,需配合本目錄下另一份組態檔
# ----------------------------------------------------
upstream front_server{
 server www.javastack.cn:9000;
}
upstream api_server{
 server www.javastack.cn:8080;
}

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

 location ~ ^/api/ {
   include enable-cors.conf;
   proxy_pass http://api_server;
   rewrite "^/api/(.*)$" /$1 break;
 }

 location ~ ^/ {
   proxy_pass http://front_server;
 }
}

到此,就完成了,

關注公眾號Java技術堆疊回復"面試"獲取我整理的2020最全面試題及答案,

推薦去我的博客閱讀更多:

1.Java JVM、集合、多執行緒、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架構、阿里巴巴等大廠最新面試題

覺得不錯,別忘了點贊+轉發哦!

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

標籤:Java

上一篇:springboot2整合mybatis-plus3踩到的坑

下一篇:strpbrk與strstr函式有區別嗎

標籤雲
其他(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