1. 程式人生 > >2-2-運維必備核心技能-nginx基礎入門

2-2-運維必備核心技能-nginx基礎入門

tex 早期 版本支持 多少 自己 文件 保存 不支持 物理cpu

Nginx的程序架構:
master/worker
一個master進程:---主進程
負載加載和分析配置文件、管理worker進程、平滑升級
一個或多個worker進程---子進程
處理並響應用戶請求
緩存相關的進程:
cache loader:載入緩存對象
cache manager:管理緩存對象
特性:異步、事件驅動和非阻塞
並發請求處理:通過kevent、epoll、select、/dev/poll
文件io:高級io sendfile,異步,mmap
nginx模塊:高度模塊化,但其模塊早期不支持dso機制(模塊在編譯支持時才能用),近期版本支持動態裝載和卸載(只對特定模塊);
模塊分類:---主程序只是一個核心框架,其他功能包括web都是通過模塊來實現
核心模塊:core module
標準模塊:
HTTP modules:
Standard HTTP modules---標準
Optional HTTP modules---可選
Mail modules
Stream modules---流模塊,實現傳輸層4層負載均衡
傳輸層代理
3rd party modules---第三方模塊,非標準,自己打補丁才能用
nginx的功用:
靜態的web資源服務器;(圖片服務器,或js/css/html/txt等靜態資源服務器)
結合FastCGI(反代給fpmserver)/uwSGI/SCGI等協議反代動態資源請求;memcache反代給memcached server,http反代給web server,眾多server都可以叫做後端服務器(backend)
http/https協議的反向代理;
imap4/pop3協議的反向代理;
tcp/udp協議的請求轉發;
nginx的安裝配置;
官方的預制包:
先使用yum info nginx查看一下有沒有這個rpm包
http://nginx.org/packages/centos/7/x86_64/RPMS/---自己建立yum倉庫指向這裏(/etc/yum.repos.d/nginx.repo)
Fedora-EPEL
[nginx]
name=nginx repository
baseurl=http://nginx.org/packages/centos/7/x86_64/RPMS/
gpgcheck=0
yum repolist---查看倉庫列表
yum install nginx
或者自己把官方的rpm包下載下來,在本地安裝
編譯安裝:
~]#yum groupinstall "Development Tools" "Server Platform Development"---安裝兩個組,依然不能解決依賴關系
~]#yum install pcre-devel openssl-devel zlib-devel(網絡通信壓縮庫)
~]#useradd -r nginx---主控進程以root身份運行,worker以普通用戶身份運行
~]#./configure --prefix=/usr/local/nginx(默認安裝目錄) --conf-path=/etc/nginx/nginx.conf(主配置文件路徑) --error-log-path=/var/log/nginx/error.log(錯誤日誌路徑) --http-log-path=/var/log/nginx/access.log(訪問日誌路徑) --pid-
path=/var/run/nginx.pid(進程文件路徑) --lock-path=/var/run/nginx.lock(鎖文件路徑) --user=nginx --group=nginx(以什麽用戶組身份運行) --with-http_ssl_module --with-http_v2_module --with_http_dav_module(分布式版本協作,支持put、delete方法的模塊,不需要就不安裝,不安全) --with-
http_stub_status_module(內建的狀態頁面類似httpd) --with-threads(線程池管理線程的邏輯,比默認的管理方式(work-process單個進程響應多少請求)更加高效 ) --with-file-aio(文件異步IO)(with額外裝載的模塊,nginx編譯時,有些模塊不會編譯,會編譯的不想使用就用without去掉)
#make&makeinstall
安裝以後設置開機自啟---自己寫一個unitfile
復制一下/usr/lib/systemd/system/nginx.service這個文件(這是指定官方倉庫安裝後的文件),並修改一下就可以了
systemctl start nginx.service
使用ss -tnlp查看監聽端口
使用ps -axu查看nginx有幾個worker
程序環境:
配置文件的組成部分:
主配置文件:/etc/nginx/nginx.conf
Include conf.d/*.conf---把這個路徑下所有以.conf結尾的配置文件都包含進來
fastcgi,uwsgi,scgi等協議相關的配置文件
mime.types:支持的mime類型---mime多用途互聯網郵件擴展
主程序文件:/usr/sbin/nginx---這個主程序文件有很多參數,其中-V會顯示編譯的選項,我們可以復制,-s reload 可以重新裝載配置文件不用重啟服務-t可以測試配置文件語法
要想運行服務,可以直接使用命令也可以使用Unit File方式來啟用(systemctl start nginx.service,ss -tnlp查看監聽的端口,ps -aux查看啟動的進程)
配置:
主配置文件的配置指令:
directive value [value2......];
註意:
(1)指令必須以分號結尾;
(2)支持使用配置變量;
內建變量:由nginx模塊引入,可直接引用;
自定義變量:由用戶使用set命令定義
set variable_name value;---也可以改內建變量的值
引用變量:$variable_name
主配置文件結構:
main block:主配置段,也即全局配置段;
event{
...
};事件驅動相關的配置
http{
...
};http/https協議相關的配置段;
mail{
...
};
stream{
...
};
http協議相關的配置結構---沒有中心主機的概念,就算只有一個主機也要配置成虛擬主機
http{
...
...:各server的公共配置
server{
...
}:每個server用於定義一個虛擬主機;
server{
...
listen---監聽地址端口
server_name---主機名
root---相當於document_root,指定站點根目錄
alias---路徑別名
location[OPERATOR] URL{---基於url限制能不能訪問,不能基於文件系統(也就是文件路徑)
...
if CONDITION{---基於條件來定義
...
}
}
}
}

nginx可以實現event-driven、asynchronous、non-blocking
針對網絡IO:
收到用戶請求以後,nginx還可以管理緩存,後端服務器響應內容可以保存在nginx本地,然後再給用戶響應,第二個用戶請求時,查詢緩存,如果有直接返回(實現加速)
而這個緩存空間,nginx需要兩個進程來管理cache loader,cache manager
針對磁盤IO:
可以是實現高級IO、sendfile、AIO(異步IO模型)、mmap(內存映射,在內存中開辟空間映射硬盤數據,直接訪問硬盤數據,不用復制,想想上一節課的兩階段)、etc

nginx作為web server:是一個master/worker模型,master用來裝載配置文件,啟動worker進程,平滑升級(不用停nginx,就能升級版本)

每次更改nginx的配置以後,要檢查一下有沒有語法錯誤nginx -t,並重新載入一下配置nginx -s reload

然後詳細講解安裝nginx以後的配置文件/etc/nginx/nginx.conf
user nginx;
worker_processes auto;---配置工作進程數量,這裏一般是自動,對應cpu核心數,改為更多意義不大
error_log /var/log/nginx/error.log;---錯誤日誌
pid /run/nginx.pid
worker_cpu_affinity auto;---把進程跟cpu自動一對一綁定

include /usr/share/nginx/modules/*.conf;---動態裝載某些模塊

events {
worker_connections 1024;---這裏對應上邊的worker_processes,這裏不可隨意更改
}

http {
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘---日誌格式、日誌的名稱、內置的變量(客戶端地址、遠程用戶(basic認證使用)、本地時間、請求報文的起始行)
‘$status $body_bytes_sent "$http_referer" ‘---響應碼、body部分字節數、引用(從上次訪問跳轉過來的,怎麽到當前網頁的)
‘"$http_user_agent" "$http_x_forwarded_for" ‘;---什麽瀏覽器、代理服務器在代理轉發時會加一個真正客戶端請求地址是誰
access_log /var/log/nginx/access.log main---訪問日誌、日誌名稱

sendfile    on;---發送文件,用戶請求文件,由內核封裝響應報文不用復制文件,提升性能
tcp_nopush  on;
tcp_nodelay on;
keepalive_timeout   65;保持連接的超時時長
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type    application/octet-stream;---默認把每個文件識別成八進制的數據流
#load modular configuration files from the /etc/nginx/conf.d directory.
#see http://nginx.org/en/docs/ngx_core_module.html#include
#for more information.
include /etc/nginx/conf.d/*.conf;

server {
    listen      80 default_server;---基於域名的訪問,默認虛擬主機,如果用戶訪問的虛擬主機找不到,就訪問所有虛擬主機的第一個,不想第一個響應就設置默認的
    listen      [::]:80 default_server;---基於ipv6地址的訪問
    server_name _;---下劃線可以匹配所有主機名
    root        /usr/share/nginx/html;---默認網頁根路徑

    #load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location / {
    }

    error page 404 /404.html;---自定義錯誤頁
        location = /40x.html {
    }

    error page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

#setting for a TLS enabled server.
}

那自己添加一個虛擬主機的做法
mkdir /data/nginx/vhost1 -pv ---最好和主機名一致
vim /data/nginx/vhost1/index.html
vim conf.d/vhost1.conf
server {
listen 80;
server_name www.ilinux.io;---給了主機名,訪問的就是你定義的,不給訪問的就是默認的
root /data/nginx/vhost1;
}
nginx -t測試語法
nginx -s reload重新載入配置文件不用重啟

Nginx(2)
配置指令:
main配置段常見的配置命令:
分類:
正常運行必備的配置
優化性能相關的配置
用於調試及定位問題相關的配置
事件驅動相關的配置
正常運行必備的配置:
1、user
Syntax:user user [group]---組可以省略
Default:user nobody nobody;
Context:main

                Defines user and group credentials used by worker processes.If group is omitted,a group whose name equals that of user is used.
            2、pid/PATH/TO/PID_FILE:
                指定存儲nginx主進程進程號碼的文件路徑
            3、include file | mask(掩碼就是通配符)
                指明包含進來的其他配置文件片段
            4、load_module file
            指明要裝載的動態模塊
        性能優化相關的配置
            1、worker_processer number | auto;
                worker進程的數量;通常應該等於小於當前主機的cpu的物理核心數;
                auto:當前主機物理cpu核心數
            2、worker_cpu_affinity cpumask ...;---把進程跟cpu一對一綁定,可以提前隔離出cpu再綁定,也可以簡單手工綁定(這種效果好),如果只運行nginx可以綁定,如果還要運行其他進程最好不要綁定
                worker_cpu_affinity auto [cpumask];
                cpu mask:---有4個cpu用4個0表示,有8個就用8個0
                    00000001:0號cpu
                    00000010:1號cpu
                    00000100:2號cpu
            3、worker_priority number:
                指定worker進程的nice值,設定worker進程優先級;[-20,20]
            4、worker_rlimit_nofile number;
                worker進程所能夠打開的文件數量上限
        調試、定位問題:

2-2-運維必備核心技能-nginx基礎入門