
### 什么是Nginx?
* Nginx是一個 輕量級/高性能的反向代理Web服務器,他實現非常高效的反向代理、負載平衡,他可以處理2-3萬并發連接數,官方監測能支持5萬并發,現在中國使用nginx網站用戶有很多,例如:新浪、網易、 騰訊等。
### 為什么要用Nginx?
* 跨平臺、配置簡單、方向代理、高并發連接:處理2-3萬并發連接數,官方監測能支持5萬并發,內存消耗小:開啟10個nginx才占150M內存 ,nginx處理靜態文件好,耗費內存少,
* 而且Nginx內置的健康檢查功能:如果有一個服務器宕機,會做一個健康檢查,再發送的請求就不會發送到宕機的服務器了。重新將請求提交到其他的節點上。
* 使用Nginx的話還能:
1. 節省寬帶:支持GZIP壓縮,可以添加瀏覽器本地緩存
2. 穩定性高:宕機的概率非常小
3. 接收用戶請求是異步的
### 為什么Nginx性能這么高?
* 因為他的事件處理機制:異步非阻塞事件處理機制:運用了epoll模型,提供了一個隊列,排隊解決
### Nginx怎么處理請求的?
* nginx接收一個請求后,首先由listen和server\_name指令匹配server模塊,再匹配server模塊里的location,location就是實際地址
~~~
server { # 第一個Server區塊開始,表示一個獨立的虛擬主機站點
listen 80; # 提供服務的端口,默認80
server_name localhost; # 提供服務的域名主機名
location / { # 第一個location區塊開始
root html; # 站點的根目錄,相當于Nginx的安裝目錄
index index.html index.htm; # 默認的首頁文件,多個用空格分開
} # 第一個location區塊結果
}
復制代碼
~~~
### 什么是正向代理和反向代理?
1. 正向代理就是一個人發送一個請求直接就到達了目標的服務器
2. 反方代理就是請求統一被Nginx接收,nginx反向代理服務器接收到之后,按照一定的規 則分發給了后端的業務處理服務器進行處理了
### 使用“反向代理服務器的優點是什么?
* 反向代理服務器可以隱藏源服務器的存在和特征。它充當互聯網云和web服務器之間的中間層。這對于安全方面來說是很好的,特別是當您使用web托管服務時。
### Nginx的優缺點?
* 優點:
1. 占內存小,可實現高并發連接,處理響應快
2. 可實現http服務器、虛擬主機、方向代理、負載均衡
3. Nginx配置簡單
4. 可以不暴露正式的服務器IP地址
* 缺點: 動態處理差:nginx處理靜態文件好,耗費內存少,但是處理動態頁面則很雞肋,現在一般前端用nginx作為反向代理抗住壓力,
### Nginx應用場景?
1. http服務器。Nginx是一個http服務可以獨立提供http服務。可以做網頁靜態服務器。
2. 虛擬主機。可以實現在一臺服務器虛擬出多個網站,例如個人網站使用的虛擬機。
3. 反向代理,負載均衡。當網站的訪問量達到一定程度后,單臺服務器不能滿足用戶的請求時,需要用多臺服務器集群可以使用nginx做反向代理。并且多臺服務器可以平均分擔負載,不會應為某臺服務器負載高宕機而某臺服務器閑置的情況。
4. nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口網關,對每個接口服務進行攔截。
### Nginx目錄結構有哪些?
~~~
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp
├── conf # Nginx所有配置文件的目錄
│ ├── fastcgi.conf # fastcgi相關參數的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始備份文件
│ ├── fastcgi_params # fastcgi的參數文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒體類型
│ ├── mime.types.default
│ ├── nginx.conf # Nginx主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相關參數文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相關參數文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi臨時數據目錄
├── html # Nginx默認站點目錄
│ ├── 50x.html # 錯誤頁面優雅替代顯示文件,例如當出現502錯誤時會調用此頁面
│ └── index.html # 默認的首頁文件
├── logs # Nginx日志目錄
│ ├── access.log # 訪問日志文件
│ ├── error.log # 錯誤日志文件
│ └── nginx.pid # pid文件,Nginx進程啟動后,會把所有進程的ID號寫到此文件
├── proxy_temp # 臨時目錄
├── sbin # Nginx命令目錄
│ └── nginx # Nginx的啟動命令
├── scgi_temp # 臨時目錄
└── uwsgi_temp # 臨時目錄
復制代碼
~~~
### Nginx配置文件nginx.conf有哪些屬性模塊?
~~~
worker_processes 1; # worker進程的數量
events { # 事件區塊開始
worker_connections 1024; # 每個worker進程支持的最大連接數
} # 事件區塊結束
http { # HTTP區塊開始
include mime.types; # Nginx支持的媒體類型庫文件
default_type application/octet-stream; # 默認的媒體類型
sendfile on; # 開啟高效傳輸模式
keepalive_timeout 65; # 連接超時
server { # 第一個Server區塊開始,表示一個獨立的虛擬主機站點
listen 80; # 提供服務的端口,默認80
server_name localhost; # 提供服務的域名主機名
location / { # 第一個location區塊開始
root html; # 站點的根目錄,相當于Nginx的安裝目錄
index index.html index.htm; # 默認的首頁文件,多個用空格分開
} # 第一個location區塊結果
error_page 500502503504 /50x.html; # 出現對應的http狀態碼時,使用50x.html回應客戶
location = /50x.html { # location區塊開始,訪問50x.html
root html; # 指定對應的站點目錄為html
}
}
......
復制代碼
~~~
### Nginx靜態資源?
* 靜態資源訪問,就是存放在nginx的html頁面,我們可以自己編寫
### 如何用Nginx解決前端跨域問題?
* 使用Nginx轉發請求。把跨域的接口寫成調本域的接口,然后將這些接口轉發到真正的請求地址。
### Nginx虛擬主機怎么配置?
* 1、基于域名的虛擬主機,通過域名來區分虛擬主機——應用:外部網站
* 2、基于端口的虛擬主機,通過端口來區分虛擬主機——應用:公司內部網站,外部網站的管理后臺
* 3、基于ip的虛擬主機。
#### 基于虛擬主機配置域名
* 需要建立/data/www /data/bbs目錄,windows本地hosts添加虛擬機ip地址對應的域名解析;對應域名網站目錄下新增index.html文件;
~~~
#當客戶端訪問www.lijie.com,監聽端口號為80,直接跳轉到data/www目錄下文件
server {
listen 80;
server_name www.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}
#當客戶端訪問www.lijie.com,監聽端口號為80,直接跳轉到data/bbs目錄下文件
server {
listen 80;
server_name bbs.lijie.com;
location / {
root data/bbs;
index index.html index.htm;
}
}
復制代碼
~~~
#### 基于端口的虛擬主機
* 使用端口來區分,瀏覽器使用域名或ip地址:端口號 訪問
~~~
#當客戶端訪問www.lijie.com,監聽端口號為8080,直接跳轉到data/www目錄下文件
server {
listen 8080;
server_name 8080.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}
#當客戶端訪問www.lijie.com,監聽端口號為80直接跳轉到真實ip服務器地址 127.0.0.1:8080
server {
listen 80;
server_name www.lijie.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
復制代碼
~~~
### location的作用是什么?
* location指令的作用是根據用戶請求的URI來執行不同的應用,也就是根據用戶請求的網站URL進行匹配,匹配成功即進行相關的操作。
#### location的語法能說出來嗎?
> 注意:~ 代表自己輸入的英文字母
>
> | 匹配符 | 匹配規則 | 優先級 |
> | --- | --- | --- |
> | \= | 精確匹配 | 1 |
> | ^~ | 以某個字符串開頭 | 2 |
> | ~ | 區分大小寫的正則匹配 | 3 |
> | ~\* | 不區分大小寫的正則匹配 | 4 |
> | !~ | 區分大小寫不匹配的正則 | 5 |
> | !~\* | 不區分大小寫不匹配的正則 | 6 |
> | / | 通用匹配,任何請求都會匹配到 | 7 |
#### Location正則案例
* 示例:
~~~
#優先級1,精確匹配,根路徑
location =/ {
return 400;
}
#優先級2,以某個字符串開頭,以av開頭的,優先匹配這里,區分大小寫
location ^~ /av {
root /data/av/;
}
#優先級3,區分大小寫的正則匹配,匹配/media*****路徑
location ~ /media {
alias /data/static/;
}
#優先級4 ,不區分大小寫的正則匹配,所有的****.jpg|gif|png 都走這里
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}
#優先7,通用匹配
location / {
return 403;
}
復制代碼
~~~
### 限流怎么做的?
* Nginx限流就是限制用戶請求速度,防止服務器受不了
* 限流有3種
1. 正常限制訪問頻率(正常流量)
2. 突發限制訪問頻率(突發流量)
3. 限制并發連接數
* Nginx的限流都是基于漏桶流算法,底下會說道什么是桶銅流
**實現三種限流算法**
##### 1、正常限制訪問頻率(正常流量):
* 限制一個用戶發送的請求,我Nginx多久接收一個請求。
* Nginx中使用ngx\_http\_limit\_req\_module模塊來限制的訪問頻率,限制的原理實質是基于漏桶算法原理來實現的。在nginx.conf配置文件中可以使用limit\_req\_zone命令及limit\_req命令限制單個IP的請求處理頻率。
~~~
#定義限流維度,一個用戶一分鐘一個請求進來,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
#綁定限流維度
server{
location/seckill.html{
limit_req zone=zone;
proxy_pass http://lj_seckill;
}
}
復制代碼
~~~
* 1r/s代表1秒一個請求,1r/m一分鐘接收一個請求, 如果Nginx這時還有別人的請求沒有處理完,Nginx就會拒絕處理該用戶請求。
##### 2、突發限制訪問頻率(突發流量):
* 限制一個用戶發送的請求,我Nginx多久接收一個。
* 上面的配置一定程度可以限制訪問頻率,但是也存在著一個問題:如果突發流量超出請求被拒絕處理,無法處理活動時候的突發流量,這時候應該如何進一步處理呢?Nginx提供burst參數結合nodelay參數可以解決流量突發的問題,可以設置能處理的超過設置的請求數外能額外處理的請求數。我們可以將之前的例子添加burst參數以及nodelay參數:
~~~
#定義限流維度,一個用戶一分鐘一個請求進來,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
#綁定限流維度
server{
location/seckill.html{
limit_req zone=zone burst=5 nodelay;
proxy_pass http://lj_seckill;
}
}
復制代碼
~~~
* 為什么就多了一個 burst=5 nodelay; 呢,多了這個可以代表Nginx對于一個用戶的請求會立即處理前五個,多余的就慢慢來落,沒有其他用戶的請求我就處理你的,有其他的請求的話我Nginx就漏掉不接受你的請求
##### 3、 限制并發連接數
* Nginx中的ngx\_http\_limit\_conn\_module模塊提供了限制并發連接數的功能,可以使用limit\_conn\_zone指令以及limit\_conn執行進行配置。接下來我們可以通過一個簡單的例子來看下:
~~~
http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}
server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.lijie.net permanent;
}
}
復制代碼
~~~
* 上面配置了單個IP同時并發連接數最多只能10個連接,并且設置了整個虛擬服務器同時最大并發數最多只能100個鏈接。當然,只有當請求的header被服務器處理后,虛擬服務器的連接數才會計數。剛才有提到過Nginx是基于漏桶算法原理實現的,實際上限流一般都是基于漏桶算法和令牌桶算法實現的。接下來我們來看看兩個算法的介紹:
### 漏桶流算法和令牌桶算法知道?
#### 漏桶算法
* 漏桶算法是網絡世界中流量整形或速率限制時經常使用的一種算法,它的主要目的是控制數據注入到網絡的速率,平滑網絡上的突發流量。漏桶算法提供了一種機制,通過它,突發流量可以被整形以便為網絡提供一個穩定的流量。也就是我們剛才所講的情況。漏桶算法提供的機制實際上就是剛才的案例:**突發流量會進入到一個漏桶,漏桶會按照我們定義的速率依次處理請求,如果水流過大也就是突發流量過大就會直接溢出,則多余的請求會被拒絕。所以漏桶算法能控制數據的傳輸速率。**

#### 令牌桶算法
* 令牌桶算法是網絡流量整形和速率限制中最常使用的一種算法。典型情況下,令牌桶算法用來控制發送到網絡上的數據的數目,并允許突發數據的發送。Google開源項目Guava中的RateLimiter使用的就是令牌桶控制算法。**令牌桶算法的機制如下:存在一個大小固定的令牌桶,會以恒定的速率源源不斷產生令牌。如果令牌消耗速率小于生產令牌的速度,令牌就會一直產生直至裝滿整個令牌桶。**

### 為什么要做動靜分離?
* Nginx是當下最熱的Web容器,網站優化的重要點在于靜態化網站,網站靜態化的關鍵點則是是動靜分離,動靜分離是讓動態網站里的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以后,我們則根據靜態資源的特點將其做緩存操作。
* 讓靜態的資源只走靜態資源服務器,動態的走動態的服務器
* Nginx的靜態處理能力很強,但是動態處理能力不足,因此,在企業中常用動靜分離技術。
* 對于靜態資源比如圖片,js,css等文件,我們則在反向代理服務器nginx中進行緩存。這樣瀏覽器在請求一個靜態資源時,代理服務器nginx就可以直接處理,無需將請求轉發給后端服務器tomcat。 若用戶請求的動態文件,比如servlet,jsp則轉發給Tomcat服務器處理,從而實現動靜分離。這也是反向代理服務器的一個重要的作用。
### Nginx怎么做的動靜分離?
* 只需要指定路徑對應的目錄。location/可以使用正則表達式匹配。并指定對應的硬盤中的目錄。如下:(操作都是在Linux上)
~~~
location /image/ {
root /usr/local/static/;
autoindex on;
}
復制代碼
~~~
1. 創建目錄
~~~
mkdir /usr/local/static/image
復制代碼
~~~
2. 進入目錄
~~~
cd /usr/local/static/image
復制代碼
~~~
3. 放一張照片上去#
~~~
1.jpg
復制代碼
~~~
4. 重啟 nginx
~~~
sudo nginx -s reload
復制代碼
~~~
5. 打開瀏覽器 輸入 server\_name/image/1.jpg 就可以訪問該靜態圖片了
### Nginx負載均衡的算法怎么實現的?策略有哪些?
* 為了避免服務器崩潰,大家會通過負載均衡的方式來分擔服務器壓力。將對臺服務器組成一個集群,當用戶訪問時,先訪問到一個轉發服務器,再由轉發服務器將訪問分發到壓力更小的服務器。
* Nginx負載均衡實現的策略有以下五種:
#### 1 輪詢(默認)
* 每個請求按時間順序逐一分配到不同的后端服務器,如果后端某個服務器宕機,能自動剔除故障系統。
~~~
upstream backserver {
server 192.168.0.12;
server 192.168.0.13;
}
復制代碼
~~~
#### 2 權重 weight
* weight的值越大分配
* 到的訪問概率越高,主要用于后端每臺服務器性能不均衡的情況下。其次是為在主從的情況下設置不同的權值,達到合理有效的地利用主機資源。
~~~
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
}
復制代碼
~~~
* 權重越高,在被訪問的概率越大,如上例,分別是20%,80%。
#### 3 ip\_hash( IP綁定)
* 每個請求按訪問IP的哈希結果分配,使來自同一個IP的訪客固定訪問一臺后端服務器,`并且可以有效解決動態網頁存在的session共享問題`
~~~
upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}
復制代碼
~~~
#### 4 fair(第三方插件)
* 必須安裝upstream\_fair模塊。
* 對比 weight、ip\_hash更加智能的負載均衡算法,fair算法可以根據頁面大小和加載時間長短智能地進行負載均衡,響應時間短的優先分配。
~~~
upstream backserver {
server server1;
server server2;
fair;
}
復制代碼
~~~
* 哪個服務器的響應速度快,就將請求分配到那個服務器上。
#### 5、url\_hash(第三方插件)
* 必須安裝Nginx的hash軟件包
* 按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,可以進一步提高后端緩存服務器的效率。
~~~
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
復制代碼
~~~
### Nginx配置高可用性怎么配置?
* 當上游服務器(真實訪問服務器),一旦出現故障或者是沒有及時相應的話,應該直接輪訓到下一臺服務器,保證服務器的高可用
* Nginx配置代碼:
~~~
server {
listen 80;
server_name www.lijie.com;
location / {
### 指定上游服務器負載均衡服務器
proxy_pass http://backServer;
###nginx與上游服務器(真實訪問的服務器)超時時間 后端服務器連接的超時時間_發起握手等候響應超時時間
proxy_connect_timeout 1s;
###nginx發送給上游服務器(真實訪問的服務器)超時時間
proxy_send_timeout 1s;
### nginx接受上游服務器(真實訪問的服務器)超時時間
proxy_read_timeout 1s;
index index.html index.htm;
}
}
復制代碼
~~~
### Nginx怎么判斷別IP不可訪問?
~~~
# 如果訪問的ip地址為192.168.9.115,則返回403
if ($remote_addr = 192.168.9.115) {
return 403;
}
復制代碼
~~~
### 怎么限制瀏覽器訪問?
~~~
## 不允許谷歌瀏覽器訪問 如果是谷歌瀏覽器返回500
if ($http_user_agent ~ Chrome) {
return 500;
}
復制代碼
~~~
### Rewrite全局變量是什么?
> | 變量 | 含義 |
> | --- | --- |
> | $args | 這個變量等于請求行中的參數,同$query\_string |
> | $content length | 請求頭中的Content-length字段。 |
> | $content\_type | 請求頭中的Content-Type字段。 |
> | $document\_root | 當前請求在root指令中指定的值。 |
> | $host | 請求主機頭字段,否則為服務器名稱。 |
> | $http\_user\_agent | 客戶端agent信息 |
> | $http\_cookie | 客戶端cookie信息 |
> | $limit\_rate | 這個變量可以限制連接速率。 |
> | $request\_method | 客戶端請求的動作,通常為GET或POST。 |
> | $remote\_addr | 客戶端的IP地址。 |
> | $remote\_port | 客戶端的端口。 |
> | $remote\_user | 已經經過Auth Basic Module驗證的用戶名。 |
> | $request\_filename | 當前請求的文件路徑,由root或alias指令與URI請求生成。 |
> | $scheme | HTTP方法(如http,https)。 |
> | $server\_protocol | 請求使用的協議,通常是HTTP/1.0或HTTP/1.1。 |
> | $server\_addr | 服務器地址,在完成一次系統調用后可以確定這個值。 |
> | $server\_name | 服務器名稱。 |
> | $server\_port | 請求到達服務器的端口號。 |
> | $request\_uri | 包含請求參數的原始URI,不包含主機名,如”/foo/bar.php?arg=baz”。 |
> | $uri | 不帶請求參數的當前URI,$uri不包含主機名,如”/foo/bar.html”。 |
> | $document\_uri | 與$uri相同。 |
- 常見面試題
- 一.Java常見面試題
- 1.Java基礎
- 3.面向對象概念
- 10.Java面試題
- Java基礎知識面試題(總結最全面的面試題)
- 設計模式面試題(總結最全面的面試題)
- Java集合面試題(總結最全面的面試題)
- JavaIO、BIO、NIO、AIO、Netty面試題(總結最全面的面試題)
- Java并發編程面試題(總結最全面的面試題)
- Java異常面試題(總結最全面的面試題)
- Java虛擬機(JVM)面試題(總結最全面的面試題)
- Spring面試題(總結最全面的面試題)
- Spring MVC面試題(總結最全面的面試題)
- Spring Boot面試題(總結最全面的面試題)
- Spring Cloud面試題(總結最全面的面試題)
- Redis面試題(總結最全面的面試題)
- MyBatis面試題(總結最全面的面試題)
- TCP、UDP、Socket、HTTP面試題(總結最全面的面試題)
- 二、MySQL面試題
- 1.基礎部分
- MySQL面試題(總結最全面的面試題)
- HBase相關面試題整理
- Nginx面試題(總結最全面的面試題)
- RabbitMQ面試題(總結最全面的面試題)
- Dubbo面試題(總結最全面的面試題)
- ZooKeeper面試題(總結最全面的面試題)
- Tomcat面試題(總結最全面的面試題)
- Linux面試題(總結最全面的面試題)
- 超詳細的Django面試題
- SSM面試題
- 15個高頻微信小程序面試題
- VUE面試題
- Python面試題
- 二、常見問題解答列表
- 1.查看端口及殺死進程
- 三、學習電子書