1.Nginx介紹
官網:nginx.org
Nginx (“engine x”) 是一個開源的、支援高效能、高併發的WWW服務和代理服務軟體。
它是由俄羅斯人IgorSysoev開發的,最初被應用在俄羅斯的大型網站www.rambler.ru上。
2.Nginx3大主要功能
1)網頁服務:自身是靜態Web服務,
還支援動態Web服務
PHP(fastcgi_pass)
JAVA(proxy_pass)
Python(uwsgi_pass)
==================================
memcache(memcache_pass)
......
2)負載均衡\反向代理
haproxy,lvs,F5,netscaler
只支援http,現在tcp/udp。
3)快取伺服器
squid,varnish
3.特點
最大特點:靜態小檔案高併發,佔用資源少。軟體本身小。
企業面試時需要解答如下Nginx HTTP伺服器的特色及優點:
1)支援高併發:能支援幾萬併發連線(特別是靜態小檔案業務環境)。
2)資源消耗少:在3萬併發連線下,開啟10個Nginx執行緒消耗不到200MB記憶體。
3)可以做HTTP反向代理及加速快取,即負載均衡功能,內建對RS節點服務
器健康檢查功能,這相當於專業的haproxy軟體或lvs的功能。
具備squid等專業快取軟體等的快取功能。
4.Nginx主要應用場景:
1)靜態Web伺服器:
使用Nginx執行HTML、JS、CSS、小圖片等靜態資料(此功能類似lighttpd軟體)。
2)配合執行動態Web伺服器:
Nginx結合FastCGI執行PHP等動態程式(例如使用fastcgi_pass方式)。
Nginx結合proxy_pass支援Java動態程式(tomcat/resin服務)。Nginx結合uwsgi_pass支援Python。
3)反向代理/負載均衡
http負載均衡
4)做Web快取伺服器(把檔案放入記憶體裡)。
5.反向代理與負載均衡
(1)正向代理:由內向外。 代替 效率低
代替區域網內PC,請求外部應用服務。
(2)反向代理:由外向內 代替 效率低
代替外部的使用者請求內部的應用伺服器,也有負載均衡的功能,但不能混為一談。
(3)負載均衡:轉發、效率高
甩手掌櫃。
6.為什麼Nginx總體效能比Apache高?
(1)Nginx使用最新的epoll(Linux2.6核心)和kqueue(freebsd)非同步網路I/O模型,而Apache則使用的是傳統的select模型。目前Linux下能夠承受高併發訪問的Squid、Memcached軟體都採用的是epoll模型。
(2)Apache則使用的是傳統的select模型,Nginx使用高併發的epoll模型
(3)select模型:夥伴去宿舍找你,一個宿舍一個宿舍找。。效率低。
(4)epoll模型: 夥伴去宿舍找你,先問宿管大媽,看看在哪間宿舍,然後直奔具體宿舍。效率高。
7.軟體安裝方式
(1)rpm安裝
優點:安裝簡單,速度快。
缺點:依賴多,解決依賴困難繁瑣。
(2)yum安裝
優點:簡單快,自動解決依賴。
缺點:不能選擇軟體版本或軟體存放路徑。
(3)編譯安裝(原始碼編譯)
缺點:安裝速度慢,複雜,需要GCC編譯器。
優點:可以自定義安裝(版本、軟體路徑)
(4)將原始碼製作成rpm,然後放到yum倉庫,實現yum自動安裝。
缺點:一次性慢,複雜
優點:安裝快,可以自定義安裝(版本、軟體路徑)
(5)二進位制安裝
製作RPM YUM倉庫搭建
https://blog.oldboyedu.com/autodeploy-rpm/
8. 安裝Nginx
此處介紹兩種安裝方式
(1)YUM安裝
yum安裝又分為兩種安裝方式
1)epel源安裝,安裝版本低。
2)nginx官方源安裝,版本高
(2)編譯安裝
8.1 YUM安裝
(1)配置nginx官網源
1)配置nginx.repo檔案
[root@web01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
2)yum安裝nginx,並啟動
[root@web01 ~]# yum -y install nginx
3)檢查是否安裝成功
[root@web01 ~]# rpm -qa nginx
nginx-1.18.0-1.el7.ngx.x86_64
4)啟動nginx服務
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
5)檢查埠
[root@web01 ~]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6825/nginx: master
6)瀏覽器訪問測試
8.2 編譯安裝
(1)下載nginx的rpm包
[root@web01 ~]# mkdir -p /server/tools
[root@web01 ~]# cd /server/tools
[root@web01 /server/tools]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@web01 /server/tools]# ll -h
total 1016K
-rw-r--r-- 1 root root 1016K Apr 21 22:33 nginx-1.18.0.tar.gz
(2)安裝依賴
1)安裝Nginx所需的PCRE庫
安裝pcre庫是為了使nginx支援具備URL重寫功能的Rewrite模組(偽靜態)。
[root@web01 /server/tools]# yum -y install pcre pcre-devel
2)安裝openssl-devel
Nginx在使用https功能時要用到此模組,如果不裝,安裝nginx過程中,也會報錯。
[root@web01 /server/tools]# yum -y install openssl openssl-devel
(3)編譯安裝步驟
[root@web01 /server/tools]# tar xf nginx-1.18.0.tar.gz
[root@web01 /server/tools]# cd nginx-1.18.0
[root@web01 /server/tools]# useradd -s /sbin/nologin www -M #建立nginx程式使用的使用者(也就是nginx啟動的時候,內部是由該使用者啟動的)
[root@web01 /server/tools]# id www
[root@web01 /server/tools]# rpm -qa gcc* #需要安裝gcc編譯器,,沒裝的一定要裝
gcc-c++-4.8.5-36.el7.x86_64
gcc-gfortran-4.8.5-36.el7.x86_64
gcc-4.8.5-36.el7.x86_64
[root@web01 /server/tools]# ./configure --user=www --group=www --prefix=/application/nginx-1.18.0/ --with-http_stub_status_module --with-http_ssl_module --with-pcre #配置
#configure引數的作用
--prefix=PATH 路徑
--user=USER 使用者
--group=GROUP 組
--with-pcre 偽靜態
--with-http_stub_status_module 狀態
--with-http_ssl_module 加密 443
[root@web01 /server/tools]# make #編譯,把原始碼編譯成二進位制
[root@web01 /server/tools]# make install #編譯安裝
[root@web01 /server/tools]# ln -s /application/nginx-1.18.0/ /application/nginx #生成軟連線
[root@web01 /server/tools]# /application/nginx/sbin/nginx #啟動
[root@web01 /server/tools]# netstat -lntup|grep nginx #檢視啟動情況
[root@web01 /server/tools]# curl -i localhost #檢視返回狀態碼是否為200
9. Nginx目錄結構說明
[root@web02 /application/nginx]# tree
.
├── conf
│ ├── fastcgi.conf #和動態服務的介面配置引數,配合php
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types #媒體型別
│ ├── mime.types.default
│ ├── nginx.conf #主配置檔案
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default #和動態服務的介面配置引數
│ ├── uwsgi_params
│ ├── uwsgi_params.default #和動態服務的介面配置引數,配合Python
│ └── win-utf
├── fastcgi_temp
├── html #預設站點目錄。
│ ├── 50x.html
│ └── index.html #預設的首頁,10.0.0.8不指定檔案,預設載入index.html首頁。
├── logs
│ ├── access.log #訪問日誌
│ ├── error.log #Nginx錯誤日誌。
│ └── nginx.pid #程式號對應檔案。
├── sbin
│ └── nginx #啟動命令。
10. Nginx啟動疑難雜症彙總
10.1 啟動Nginx報錯:nginx: [emerg] getpwnam("nginx") failed。
這是因為沒有對應的Nginx服務使用者導致的,建立一個使用者即可。
10.2 如何檢視Nginx編譯時的引數?
[root@web01 /server/tools/nginx-1.18.0]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/application/nginx-1.18.0/ --with-http_stub_status_module --with-http_ssl_module --with-pcre
10.3 瀏覽器、wget或者curl等軟體訪問不了Nginx頁面。
此類問題的排查思路分為nginx服務端和客戶端排查,服務端排查過程如下:
(1)首先關閉selinux
[root@web01 ~]# setenforce 0
[root@web01 ~]# vim /etc/selinux/config #把SELINUX=enforcing改成SELINUX=disabled
[root@web01 ~]# grep SELINUX=disabled /etc/selinux/config
(2)然後檢查防火牆,如下:
[root@web01 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead) #表示沒有開啟
Docs: man:firewalld(1)
(3)檢查埠和程式
[root@web01 ~]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9458/nginx: master
[root@web01 ~]# ps -ef | grep [n]ginx
root 9458 1 0 20:37 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx
www 9459 9458 0 20:37 ? 00:00:00 nginx: worker process
(4)在伺服器本地wget http://192.168.1.51測試(如果前兩步滅有通過,這步就不用進行了)
[root@web01 ~]# wget http://192.168.1.51
--2020-05-19 21:04:13-- http://192.168.1.51/
Connecting to 192.168.1.51:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 612 [text/html]
Saving to: ‘index.html.1’
100%[==================================================================================================================================================>] 612 --.-K/s in 0s
2020-05-19 21:04:13 (70.4 MB/s) - ‘index.html.1’ saved [612/612]
(5)檢視nginx錯誤日誌
[root@web01 ~]# cat /application/nginx/logs/error.log
客戶端排查過程
(1)在客戶端上telnet伺服器端IP、埠
C:\Users\Administrator>ping 192.168.1.51
正在 Ping 192.168.1.51 具有 32 位元組的資料:
來自 192.168.1.51 的回覆: 位元組=32 時間<1ms TTL=64
來自 192.168.1.51 的回覆: 位元組=32 時間<1ms TTL=64 #通了,就可以排除物理鏈路問題
(2)在客戶端telnet服務端I、埠等
[root@web01 ~]# telnet 192.168.1.51 80
Trying 192.168.1.51...
Connected to 192.168.1.51.
Escape character is '^]'. #這就表示埠開放了
(3)在客戶端使用wget或curl命令檢測
[root@web01 ~]# curl -I 192.168.1.51
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Tue, 19 May 2020 13:16:16 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 May 2020 12:36:58 GMT
Connection: keep-alive
ETag: "5ec3d2ea-264"
Accept-Ranges: bytes
10.4 部署一個web站點
[root@web01 /application/nginx/html]# cat index.html
<html>
<head>
<title>老男孩58期</title>
<meta charset="UTF-8">
</head>
<body bgcolor=green>
<br>
<div align=center>
<table border=1>
<tr>
<td>ID</td>
<td>NAME</td>
</tr>
<tr>
<td>001</td>
<td>項博</td>
</tr>
<tr>
<td>002</td>
<td>項伯</td>
</tr>
</table>
</div>
</body>
</html>
瀏覽器訪問