Nginx安裝與使用
nginx的介紹
- Nginx:Web伺服器軟體,高效能,輕量級,滿足企業高併發的WEB網站訪問
- Nginx是基於C語言開發的,由Core核心和模組組成,其中核心的設計非常的微小,主要完成使用者請求到來時,讀取Nginx配置檔案,跟Location block匹配,匹配成功之後,呼叫Location中相應的指令進而啟動不同的模組來工作;(多程式-多執行緒)
- 基於Linux作業系統平臺如何構建軟體服務:基於YUM二進位制方式,基於MAKE原始碼編譯方式(生產環境推薦),掌握軟體服務安裝,配置,升級,解除安裝操作;
Nginx的高併發得益於其採用了epoll模型,與傳統的伺服器程式架構不同,epoll是Linux核心2.6以後才出現的,Nginx採用epoll模型,非同步非阻塞,而apache採用的是select模型:
- Select特點:select選擇控制程式碼(檔案)的時候,是遍歷所有控制程式碼,也就是說控制程式碼有事件響應時,select需要遍歷所有控制程式碼才能獲取到哪些控制程式碼有事件通知,因此效率是非常低的
- epoll的特點:epoll對於控制程式碼事件的選擇不是遍歷的,是事件響應的,就是控制程式碼上事件來就馬上選擇出來,不需要遍歷整個控制程式碼連結串列,因此效率非常高。
nginx的安裝
rpm安裝
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx -y
https://blog.csdn.net/sqlquan/article/details/101099850`
原始碼安裝
https://www.cnblogs.com/boonya/p/7907999.html
# nginx操作
nginx # 啟動
nginx -s stop # 停止
nginx -s reload # 重新載入
nginx匹配規則
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~|~* 正則順序) > (location 部分起始路徑) > (location /)
location = /index.html
location /index.html
location ^~ /static/ # 目錄匹配,最大字首匹配
location ~ .*\.(html|png)$ # 正則匹配,~大小寫有關,~*忽略大小寫
location @ # location內部重定向的變數
Nginx
nginx模組
Nginx web伺服器最主要就是各種模組的工作,模組從結構上分為核心模組,基礎模組和第三方模組,其中三類模組分別如下:
- 核心模組:HTTP模組,EVENT模組和MAIL模組等
- 基礎模組:HTTP Access模組,HTTP FastCGI模組,HTTP Proxy模組和HTTP Rewrite模組;
- 第三方模組:HTTP Upstream Request Hash模組, Notice模組和HTTP Access Key模組,Limit req模組,Upstream check module等;
Nginx的模組從功能上分為如下三類:
- Handlers(處理器模組):此類模組直接處理請求,並進行輸出內容和修改headers資訊等操作,Handlers處理器模組一般只能有一個;
- Filters(過濾器模組):此類模組主要對其他處理器模組輸出的內容進行修改操作,最後由Nginx輸出;
- Proxies(代理類模組):此類模組是Nginx的HTTP Upstream之類的模組,這些模組主要與後端一些服務比如FastCGI等進行互動,實現服務代理和負載均衡等功能
nginx原理
Nginx是由自身的Core核心和模組組成的,其中Core核心設計微小和簡潔,完成的功能非常的簡單,僅僅是通過查詢Nginx配置檔案(nginx.conf),將客戶端(使用者)的請求對映到一個Location Block(配置段|區域),Location是用於匹配使用者訪問的URL路徑,而Location配置段中有很多指令,一旦匹配到之後,調取相應的模組完成不同的工作;
負載均衡
upstream web_dz {
ip_hash; # 會話保持,加上這個,這個的作用就是使一個使用者只訪問固定的一個server
# max_fails表示嘗試連線的次數,fail_timeout表示超市的時間單位為秒
server 192.168.0.123:8001 weight=1 max_fails=2 fail_timeout=15s;
server 192.168.0.124:8001 weight=1 max_fails=2 fail_timeout=15s;
}
server {
listen 8001;
server_name www;
location / {
# proxy_redirect http://www.baidu.com/; # 跳轉,也可以用rewrite來實現
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr; # 使用者的ip
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
proxy_pass http://web_dz
}
}
處理靜態檔案
server {
listen 8001;
server_name www;
# 正則匹配
location ~ .*\.(js|css|html|png|jpg|txt|gif|doc|zip|bmp|docs|xls)$ {
root /data/static; # alias /data/static/;
}
location / {
root /data/template;
index index.html index.html;
}
location /static/ {
root /data/; # alias /data/static/;
# expires定義使用者瀏覽器快取的時間為3天,如果靜態頁面不常更新,可以設定更長,這樣可以節省頻寬和緩解伺服器的壓力,在瀏覽器儲存該型別檔案的天數,
expires 3d;
}
}
錯誤處理
server {
listen 8001;
server_name www;
location / {
proxy_set_header Host $host;
proxy_pass http://web_dz
}
# 當狀態出現500或502時,定位到路由為:/50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /data/template;
}
# 狀態碼
error_page 404 /40x.html;
location = /404.html {
root /data/template;
}
}
動靜分離
upstream web_dz {
ip_hash; # 會話保持,加上這個,這個的作用就是使一個使用者只訪問固定的一個server
# max_fails表示嘗試連線的次數,fail_timeout表示超市的時間單位為秒
server 192.168.0.123:8001 weight=1 max_fails=2 fail_timeout=15s;
server 192.168.0.124:8001 weight=1 max_fails=2 fail_timeout=15s;
}
server {
listen 8001;
# 多個域名訪問
server_name zs01.com zs02.com;
location / {
root html;
index index.html index.html
proxy_set_header Host $host;
proxy_pass http://web_dz
}
location ~* .*\.(html|htm|js|png|jpeg|css|txt|gif|jpg|gz|bz2|bmp|doc|xls|docs)${
root /data/static;
}
location ~* .*\.(php|jsp|do|asp|cgi){
proxy_set_header Host $host;
proxy_pass http://web_dz
}
}
rewrite
- 對搜尋引擎優化(Search Engine Optimization ,SEO)友好,利於搜尋引擎抓取網站頁面
- 隱藏網站URL真實地址,瀏覽器顯示更加美觀
- 網站變更升級,可以基於Rewrite臨時重定向到其他頁面
Nginx Rewrite規則使用中有三個概念需要理解,分別是:Rewrite結尾識別符號,Rewrite規則常用表示式,Rewrite變數,如下三個概念的詳解:
(1) Nginx Rewrite結尾識別符號,用於Rewrite規則末尾,表示規則的執行屬性
last:相當於Apache裡的(L)標記,表示完成rewrite匹配,展示後面的內容,但url不變
break:本條規則匹配完成後,終止匹配,不再匹配後面的規則
redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
permanent:返回301永久重定向,瀏覽器位址列會顯示跳轉後的URL地址
其中last和break用來實現URL重寫時,瀏覽器位址列URL地址不變
(2)Nginx Rewrite規則常用表示式,主要用於匹配引數/字串及過濾設定
. 匹配任何單字元
[0-9] 匹配字串0-9
[^0-9] 不匹配字串0-9
abc|edf 可選擇的字串:abc|edf
? 匹配0到1個字元
* 匹配0到多個字元
+ 匹配1到多個字元
^ 字串開始標誌
$ 字串結束標誌
\n 轉義符標誌
(3)Nginx Rewrite變數,常用於匹配HTTP請求頭資訊,瀏覽器主機名,URL等
HTTP_USER_AGENT 使用者使用的代理,例如瀏覽器
HTTP_REFERER 告知伺服器,從那個頁面來訪問的
HTTP_COOKIE 客戶端快取,主要用於儲存使用者名稱和密碼等資訊
HTTP_HOST 匹配伺服器ServerName域名
HTTP_ACCEPT 客戶端的瀏覽器支援的MIME型別
REMOTE_ADDR 客戶端的IP地址
QUERY_STRING URL中訪問的字串
DOCUMENT_ROOT 伺服器釋出目錄
SERVER_PORT 伺服器埠
SERVER_PROTOCOL 伺服器端協議
TIME_YEAR 年
TIME_MON 月
TIME_DAY 日
跳轉
server {
listen 8002;
server_name www.zby.com www.zby02.com;
if ($host = "www.zby.com"){
# 訪問:www.zby.com:8002/index 就跳轉到百度url
# permanent表示永久重定向
rewrite ^/index$ https://www.baidu.com permanent;
# 所有的都進行跳轉,$1接收第一個括號裡的資料
rewrite ^/(.*)$ https://www.baidu.com/$1 permanent;
}
location / {
root /data/template;
index index.html index.html;
}
}
禁止ie瀏覽器訪問
server {
listen 8002;
server_name www.zby.com www.zby02.com;
if ($host = "www.zby.com"){
# 璁塊棶錛歸ww.zby.com:8002/index 灝辮煩杞埌鐧懼害url
rewrite ^/index$ https://www.baidu.com permanent;
}
# 禁止ie瀏覽器和谷歌瀏覽器訪問,判斷是什麼東西來訪問該網站
if ( $http_user_agent ~* "(MSIE)|(Trident/6.0)|(Chrome)|(iphone)"){
# 返回404狀態碼
return 404;
}
location / {
root /data/template;
index index.html index.html;
}
}
last的作用
server {
listen 8002;
server_name www.zby.com www.zby02.com;
# 訪問/目錄,展示hello.html內容,但瀏覽器位址列URL地址不變
rewrite ^/$ /hello.html last;
rewrite ^/index.html http://www.zby.com:8002/ permanent;
location / {
root /data/template;
index index.html index.html;
}
}
args的使用
server {
listen 8002;
server_name www.zby.com www.zby02.com;
# 抓取查詢字串裡的引數tid,來進行跳轉
if ($args ~* tid=2020) {
rewrite ^/(.*)$ http://www.baidu.com permanent;
}
location / {
root /data/template;
index index.html index.html;
}
}
# 訪問 http://www.zby.com:8002/?tid=2020
優化nginx配置
user nginx;
# 一般配置與服務的核數一致,檢視cpu核數:命令,lscpu
worker_processes 8; # 生產環境一般配8個就夠用了
# 為每個程式分配cpu,將8個程式分配到8個cpu,最大化的利用cpu的效率,當然可以寫多個,或者將一個程式分配到多個cpu
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
# 該指令是當一個nginx程式開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(ulimit -n)與nginx程式數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致
# 設定系統對一個使用者開啟的檔案數 ulimit -n 60000;
worker_rlimit_nofile 60000;
# 全域性錯誤日誌及PID檔案
# 錯誤日誌定義等級,[debug|info|notice|warn|error|crit]
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
# epoll是對路服用IO中的一種方式,但是僅用於linux2.6以上核心,可以大大提高nginx的效能,預設epoll
use epoll;
# 單個後臺worker process程式的最大併發連結數(最大連線數=連線數*程式數)
worker_connections 10240; # 一個工作程式就支援連線數為10240,總共支援的連線數為:10240*8
# 儘可能多的接受請求
multi_accept on;
}
http {
include /etc/nginx/mime.types; # 識別所有檔案的型別,都在該檔案下,html,txt等等
# 當訪問的檔案字尾不在該檔案mime.types裡時,響應頭content-type: application/octet-stream
default_type application/octet-stream; # 當mime.types裡面不存在該檔案時,那麼響應頭的content-type就為這個了,這個表示下載,例如,當把mime.types中的txt註釋掉,訪問txt就表示下載了
# 日誌格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# botzero表示日誌標籤,後面可以引用
log_format botzero '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 表示使用的是botzero的日誌格式,一般用在serve裡,表示一個服務有特有的日誌格式
# access_log 表示答應日誌
access_log /var/log/nginx/access.log botzero;
# sendfile 指令指定nginx是否第哦啊用sendfile函式(zero copy 方式)來輸出檔案,對於普通應用必須設為on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的uptime
sendfile on;
# 防止網路阻塞
# tcp_nopush on;
# 開啟目錄列表訪問,合適下載伺服器(專門提供下載資源的),預設關閉
# autoindex off;
# keepalive超時時間,客戶端到伺服器端的連線持續有效時間,當出現對伺服器的後繼請求時,keepalive-timeout功能可避免建立或重新建立連線(節省伺服器資源/CPU/記憶體/網路卡)
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
# 允許客戶端請求的最大單檔案位元組數 10兆
client_max_body_size 10m;
# 緩衝區代理緩衝使用者端請求的最大位元組數
client_body_buffer_size 128k;
# nginx跟後端伺服器連線超時事件(代理連線超時)
proxy_connect_timeout 300; # 秒
# 後端伺服器資料回傳時間(代理髮送超時)
proxy_send_timeout 300;
# 連線成功後,後端伺服器響應時間(代理接收超時)
proxy_read_timeout 300;
}
下載檔案
user nginx;
# 一般配置與服務的核數一致,檢視cpu核數:命令,lscpu
worker_processes 8; # 生產環境一般配8個就夠用了
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
http {
include /etc/nginx/mime.types; # 識別所有檔案的型別,都在該檔案下,html,txt等等
# 當訪問的檔案字尾不在該檔案mime.types裡時,響應頭content-type: application/octet-stream
default_type application/octet-stream; # 當mime.types裡面不存在該檔案時,那麼響應頭的content-type就為這個了,這個表示下載,例如,當把mime.types中的txt註釋掉,訪問txt就表示下載了
}
展示資料夾裡的檔案(檔案伺服器)
server {
listen 8002;
server_name www.zby.com www.zby02.com;
if ($args ~* tid=2020) {
rewrite ^/(.*)$ http://www.baidu.com permanent;
}
location / {
root /data/template;
index index.html index.html;
}
location /static/ {
alias /data/static/; #訪問http://127.0.0.1:8002/static/a 訪問的真實路徑為:/data/static/
#root /data/; #訪問http://127.0.0.1:8002/static/a 訪問的真實路徑為:/data/static/a/;
autoindex on; # 開啟目錄列表訪問,合適下載伺服器(專門提供下載資源的),預設關閉
}
}
root和alias的區別
root和alias都可以定義在location模組中,都是用來指定請求資源的真實路徑,比如:
location /static/ {
root /data/w3/; # 後面會把匹配到url,新增到該路徑的下面,即:/data/w3/ + url(/static)
}
請求 http://foofish.net/static/top.gif 這個地址時,那麼在伺服器裡面對應的真正的資是 /data/w3/static/top.gif檔案
注意:真實的路徑是root指定的值加上location指定的值 。
而 alias 正如其名,alias指定的路徑是location的別名,不管location的值怎麼寫,資源的 真實路徑都是 alias 指定的路徑 ,比如:
location /static/ {
alias /data/w3/; # 表示匹配到的url都進入到該目錄下
}
同樣請求 http://foofish.net/static/top.gif 時,在伺服器查詢的資源路徑是: /data/w3/top.gif
其他區別:
1、alias 只能作用在location中,而root可以存在server、http和location中。
2、alias 後面必須要用 “/” 結束,否則會找不到檔案,而 root 則對 ”/” 可有可無
壓縮檔案
# 開啟壓縮
gzip on;
gzip_min_length 4k; # 小於4k的檔案就不用壓縮
gzip_buffers 4 128k; # 提供壓縮空間最小為4k 最大為128k
gzip_http_version 1.1; # 壓縮協議的版本
# 壓縮級別大小,最大為9,值越小,壓縮後比例越小,CPU處理更快
# 值越大,消耗CPU比較高
gzip_comp_level 6; # 一般設定為2 4 6,當cpu過高時,設定為2
# 圖片不建議壓縮,壓縮的型別
gzip_types text/plain application/javascript text/css application/xml;
gzip_vary on;
# 檢視檔案的型別
# 訪問:http://127.0.0.1/static/jquery.js
curl -v http://127.0.0.1/static/jquery.js # 檢視全資訊
culr -I http://127.0.0.1/static/jquery.js # 只檢視響應頭
相關文章
- Linux 安裝Nginx與使用LinuxNginx
- nginx 編譯安裝與配置使用Nginx編譯
- Nginx 安裝使用Nginx
- Nginx 安裝與配置Nginx
- Nginx安裝與代理Nginx
- Nginx安裝與配置Nginx
- 使用docker安裝nginxDockerNginx
- Nginx的安裝配置使用Nginx
- centos7中使用yum安裝NGINX安裝CentOSNginx
- RE|Nginx-安裝與配置(1)Nginx
- Docker nginx安裝與配置掛載DockerNginx
- 安裝NginxNginx
- nginx安裝Nginx
- Nginx 安裝Nginx
- Ununtu伺服器安裝Nginx與PHP伺服器NginxPHP
- docker安裝nginxDockerNginx
- Unbuntu nginx 安裝Nginx
- Linux安裝NginxLinuxNginx
- linux 安裝 nginxLinuxNginx
- nginx-安裝Nginx
- nginx ubuntu 安裝NginxUbuntu
- Mac 安裝 NginxMacNginx
- yum安裝nginxNginx
- Jenkins安裝與使用Jenkins
- Docker安裝與使用Docker
- Samba安裝與使用Samba
- DRF安裝與使用
- golint 安裝與使用Go
- Supervisor 安裝與使用
- MONGDB 安裝與使用
- nacos安裝與使用
- Presto安裝與使用REST
- Kylin安裝與使用
- Redis 安裝與使用Redis
- KubernetesNginxIngress安裝與使用Nginx
- curl 安裝與使用
- MITMF安裝與使用MIT
- Nginx入門級安裝和基礎使用Nginx