Nginx初步入門

三花發表於2020-05-19

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

nginx.org

此處介紹兩種安裝方式

(1)YUM安裝
yum安裝又分為兩種安裝方式
1)epel源安裝,安裝版本低。
2)nginx官方源安裝,版本高

(2)編譯安裝

8.1 YUM安裝

(1)配置nginx官網源
image.png

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包
image.png
image.png

[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>

瀏覽器訪問
image.png

相關文章