八、nginx基礎

1Nginx基本簡述

Nginx是一個開源且高性能、可靠的Http Web服務、代理服務。
開源: 直接獲取源代碼
高性能: 支持海量併發
可靠: 服務穩定
咱們爲何選擇 Nginx服務
Nginx很是輕量
功能模塊少 (源代碼僅保留http與核心模塊代碼,其他不夠核心代碼會做爲插件來安裝)
代碼模塊化 (易讀,便於二次開發,對於開發人員很是友好)
互聯網公司都選擇Nginx
1.Nginx技術成熟,具有的功能是企業最常使用並且最須要的
2.適合當前主流架構趨勢, 微服務、雲架構、中間層
3.統一技術棧, 下降維護成本, 下降技術更新成本。
Nginx採用Epool網絡模型,Apache採用Select模型
Select: 當用戶發起一次請求,select模型就會進行一次遍歷掃描,從而致使性能低下。
Epool: 當用戶發起請求,epool模型會直接進行處理,效率高效,並沒有鏈接限制。
Nginx 典型應用場景
html

2Nginx快速安裝

Nginx軟件安裝的方式有不少種
1.源碼編譯=>Nginx (1.版本隨意 2.安裝複雜 3.升級繁瑣)
2.epel倉庫=>Nginx (1.版本較低 2.安裝簡單 3.配置不易讀)
3.官方倉庫=>Nginx (1.版本較新 2.安裝簡單 3.配置易讀,推薦)html5

2.1官方倉庫

1.安裝Nginx軟件所需依賴包nginx

[root@web ~]# yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree

2.配置nginx官方yum源c++

[root@web ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

3.安裝Nginx服務,啓動並加入開機自啓web

[root@web ~]# yum install nginx -y
[root@web ~]# systemctl enable nginx
[root@web ~]# systemctl start nginx

4.經過瀏覽器訪問該服務器ip或url地址 10.0.0.7
json

5.檢查Nginx軟件版本以及編譯參數vim

[root@web ~]# nginx -v
nginx version: nginx/1.14.0
[root@web ~]# nginx -V

6.爲了讓你們更清晰的瞭解Nginx軟件的全貌,可以使用rpm -ql nginx查看總體的目錄結構及對應的功能,以下表格整理了Nginx比較重要的配置文件
1.Nginx主配置文件centos

路徑 類型 做用
/etc/nginx/nginx.conf 配置文件 nginx主配置文件
/etc/nginx/conf.d/default.conf 配置文件 默認網站配置文件

2.Nginx代理相關參數文件瀏覽器

路徑 類型 做用
/etc/nginx/fastcgi_params 配置文件 Fastcgi代理配置文件
/etc/nginx/scgi_params 配置文件 scgi代理配置文件
/etc/nginx/uwsgi_params 配置文件 uwsgi代理配置文件

3.Nginx編碼相關配置文件服務器

路徑 類型 做用
/etc/nginx/win-utf 配置文件 Nginx編碼轉換映射文件
/etc/nginx/koi-utf 配置文件 Nginx編碼轉換映射文件
/etc/nginx/koi-win 配置文件 Nginx編碼轉換映射文件
/etc/nginx/mime.types 配置文件 Content-Type與擴展名

4.Nginx管理相關命令

路徑 類型 做用
/usr/sbin/nginx 命令 Nginx命令行管理終端工具
/usr/sbin/nginx-debug 命令 Nginx命令行與終端調試工具

5.Nginx日誌相關目錄與文件

路徑 類型 做用
/var/log/nginx 目錄 Nginx默認存放日誌目錄
/etc/logrotate.d/nginx 配置文件 Nginx默認的日誌切割

2.2源碼編譯安裝

獲取官網tar包並解壓
[root@web01 ~]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
[root@web01 ~]# tar xf nginx-1.14.2.tar.gz

進入nginx-1.14.2/目錄,編譯
[root@web01 ~]# cd nginx-1.14.2/
[root@web01 nginx-1.14.2]# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx 
--modules-path=/usr/lib64/nginx/modules --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 
--http-client-body-temp-path=/var/cache/nginx/client_temp 
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat 
--with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module 
--with-http_dav_module --with-http_flv_module --with-http_gunzip_module 
--with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module 
--with-http_realip_module --with-http_secure_link_module --with-http_slice_module 
--with-http_ssl_module --with-http_stub_status_module --with-http_sub_module 
--with-http_v2_module --with-mail --with-mail_ssl_module --with-stream 
--with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module 
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' 
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

[root@web01 nginx-1.14.2]# make && make install

3Nginx默認配置

Nginx主配置文件/etc/nginx/nginx.conf是一個純文本類型的文件,整個配置文件是以區塊的形式組織的。通常,每一個區塊以一對大括號{}來表示開始與結束。
Nginx主配置文件總體分爲三塊進行學習,分別是CoreModule(核心模塊),EventModule(事件驅動模塊),HttpCoreModule(http內核模塊)

CoreModule核心模塊

user www;                       #Nginx進程所使用的用戶
worker_processes 1;             #Nginx運行的work進程數量(建議與CPU數量一致或auto)
error_log /log/nginx/error.log  #Nginx錯誤日誌存放路徑
pid /var/run/nginx.pid          #Nginx服務運行後產生的pid進程號

events事件模塊

events {            
    worker_connections 25535;  #每一個worker進程支持的最大鏈接數
    use epoll;                  #事件驅動模型, epoll默認
}

http內核模塊

http {  #http層開始
...    
    #使用Server配置網站, 每一個Server{}表明一個網站(簡稱虛擬主機)
    server {
        listen       80;            #監聽端口, 默認80
        server_name  bgx.com;       #提供的域名
        access_log  access.log;     #該網站的訪問日誌
        #控制網站訪問路徑
        location / {
            root   /usr/share/nginx/html;   #存放網站源代碼的位置
            index  index.html index.htm;    #默認返回網站的文件
        }
    }
    ...
    #第二個虛擬主機配置
    'server' {
    ...
    }
    
    include /etc/nginx/conf.d/*.conf;  #包含/etc/nginx/conf.d/目錄下全部以.conf結尾的文件

}   #http層結束

http server location擴展瞭解項

http{}層下容許有多個Server{}層,一個Server{}層下又容許有多個Location
http{} 標籤主要用來解決用戶的請求與響應。
server{} 標籤主要用來響應具體的某一個網站。
location{} 標籤主要用於匹配網站具體URL路徑。

4Nginx網站配置

4.1.新增nginx配置文件

[root@web01 conf.d]# cat /etc/nginx/conf.d/game.conf 
server {
    listen 80;
    server_name game.oldboy.com;

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

4.2.放置遊戲源代碼文件至nginx配置文件root指定的目錄

[root@web01 conf.d]# mkdir /code && cd /code
[root@web01 code]# rz  html5.zip
[root@web01 code]# unzip html5.zip
[root@web01 code]# ls
ceshi  game  html5.zip  img  index.html  readme.txt

4.3.檢查nginx的語法是否存在錯誤

[root@web01 code]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

4.4.重載Nginx [reload|restart]

[root@web01 code]# systemctl reload nginx

5Nginx虛擬主機

一般在企業中可能會有不少業務系統,那麼多套業務服務如何使用Nginx配置?

若是使用如上方式部署,則須要多臺服務器配置Nginx,但若是使用虛擬主機方式,則在同一個Nginx上運行多套單獨服務,這些服務是相互獨立的。簡單來講,看似多套業務系統,實則能夠運行在一臺Nginx服務上

Nginx配置虛擬主機有以下三種方式:

方式1、基於主機多IP方式
方式2、基於端口的配置方式
方式3、基於多個hosts名稱方式(多域名方式)

5.1基於多IP的虛擬主機配置實戰


那麼基於多IP的方式,有以下兩種方式:

1.配置多網卡多IP的方式

server {
    ...
    listen 10.0.0.10:80;
    ...
}

server {
    ...
    listen 10.0.0.11:80;
    ...
}

2.配置單網卡多IP的方式

#添加一個IP
[root@web01 ~]# ip addr add 10.0.0.11/24 dev eth0

# 虛擬機配置方案
[root@web01 ~]# cat /etc/nginx/conf.d/addr1.conf
server {
    ...
    listen 10.0.0.10:80;
    ...
}

[root@web01 ~]# cat /etc/nginx/conf.d/addr2.conf
server {
    ...
    listen 10.0.0.11:80;
    ...
}

5.2基於端口虛擬主機配置實戰


Nginx多端口虛擬主機方式,具體配置以下

#僅修改listen監聽端口便可, 但不能和系統端口出現衝突

[root@web01 ~]# cat /etc/nginx/conf.d/port1.conf
server {
    ...
    listen 80;
    ...
}

[root@web01 ~]# cat /etc/nginx/conf.d/port2.conf
server {
    ...
    listen 81;
    ...
}

[root@web01 ~]# cat /etc/nginx/conf.d/port3.conf
server {
    ...
    listen 82;
    ...
}

5.3基於host名稱的虛擬主機方式配置實戰

1.建立對應的web站點目錄以及程序代碼

[root@web01 ~]# mkdir /soft/code/{server1,server2}
[root@web01 ~]# echo "server1" > /code/server1/index.html
[root@web01 ~]# echo "server2" > /code/server2/index.html

2.配置不一樣域名的虛擬主機

[root@web02 ~]# cat /etc/nginx/conf.d/server1.conf
server {
    listen       80;
    server_name  1.xuliangwei.com;
    root /code/server1;
    index index.html;
    ...
}
[root@web01 ~]# cat /etc/nginx/conf.d/server2.conf
server {
    ...
    listen       80;
    server_name  2.xuliangwei.com;
    root /code/server2;
    index index.html;
}

6Nginx日誌管理

Nginx有很是靈活的日誌記錄模式,每一個級別的配置能夠有各自獨立的訪問日誌。日誌格式經過log_format命令定義格式。

6.3.1.log_format定義日誌格式語法

# 配置語法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http

6.3.2.默認Nginx定義語法格式以下

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

6.3.3.Nginx日誌格式容許包含的內置變量

$remote_addr        # 記錄客戶端IP地址
$remote_user        # 記錄客戶端用戶名
$time_local         # 記錄通用的本地時間
$time_iso8601       # 記錄ISO8601標準格式下的本地時間
$request            # 記錄請求的方法以及請求的http協議
$status             # 記錄請求狀態碼(用於定位錯誤信息)
$body_bytes_sent    # 發送給客戶端的資源字節數,不包括響應頭的大小
$bytes_sent         # 發送給客戶端的總字節數
$msec               # 日誌寫入時間。單位爲秒,精度是毫秒。
$http_referer       # 記錄從哪一個頁面連接訪問過來的
$http_user_agent    # 記錄客戶端瀏覽器相關信息
$http_x_forwarded_for #記錄客戶端IP地址
$request_length     # 請求的長度(包括請求行, 請求頭和請求正文)。
$request_time       # 請求花費的時間,單位爲秒,精度毫秒
# 注:若是Nginx位於負載均衡器,nginx反向代理以後, web服務器沒法直接獲取到客 戶端真實的IP地址。
# $remote_addr獲取的是反向代理的IP地址。 反向代理服務器在轉發請求的http頭信息中,
# 增長X-Forwarded-For信息,用來記錄客戶端IP地址和客戶端請求的服務器地址。

6.3.4.access_log日誌配置語法

Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except

6.3.5.Nginx Access日誌配置實踐

server {
    listen 80;
    server_name code.oldboy.com;
    
    #將當前的server網站的訪問日誌記錄至對應的目錄,使用main格式
    access_log /var/log/nginx/code.oldboy.com.log main;
    location / {
        root /code;
    }

    #當有人請求改favicon.ico時,不記錄日誌
    location /favicon.ico {
        access_log off;
        return 200;
    }
}

6.3.6.日誌切割logrotate

[root@nginx conf.d]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
        daily                   # 天天切割日誌
        missingok               # 日誌丟失忽略
        rotate 52               # 日誌保留52天
        compress                # 日誌文件壓縮
        delaycompress           # 延遲壓縮日誌
        notifempty              # 不切割空文件
        create 640 nginx adm    # 日誌文件權限
        sharedscripts
        postrotate      # 切割日誌執行的命令
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

6.3.7.日誌切割後的效果

[root@bgx ~]# ll /var/log/nginx/
total 4044
-rw-r----- 1 www adm  54438 Oct 12 03:28 access.log-20181012.gz
-rw-r----- 1 www adm  28657 Oct 13 03:48 access.log-20181013.gz
-rw-r----- 1 www adm  10135 Oct 12 03:28 error.log-20181130.gz
-rw-r----- 1 www adm   7452 Oct 13 03:48 error.log-20181201.gz
相關文章
相關標籤/搜索