Nginx是由Igor Sysoev(俄羅斯人)為當(dāng)?shù)鼐W(wǎng)站Rambler.ru所開(kāi)發(fā)的一款高性能WEB 服務(wù)軟件,第一個(gè)公開(kāi)版本于2004年10月發(fā)布。一開(kāi)始Nginx并不為人所知,后來(lái)由于它誘人的高并發(fā)架構(gòu)、模塊化設(shè)計(jì)、反向代理/負(fù)載均衡功能以及不少于Apache的多樣化功能使得它越來(lái)越流行,使得它目前的市場(chǎng)占有率甚至要超過(guò)Apache。
Nginx官方網(wǎng)站,隨著近些年Nginx使用量越來(lái)越高,它的版本迭代效率也是非常之高。在國(guó)內(nèi)幾乎所有的大型互聯(lián)網(wǎng)企業(yè)都在使用Nginx,而阿里巴巴公司更是基于Nginx開(kāi)發(fā)了它的一個(gè)分支版本Tengine。Nginx之所以非常流行得益于它的高并發(fā)特性,當(dāng)然反向代理和負(fù)載均衡的功能也是各個(gè)企業(yè)使用Nginx作為WEB服務(wù)器的主要原因之一。 nginx作為HTTP服務(wù)器,專為性能優(yōu)化而開(kāi)發(fā),性能是其最重要的考量,實(shí)現(xiàn)上非常注重效率 。它支持內(nèi)核epoll模型,基于事件處理請(qǐng)求連接,從而能經(jīng)受高負(fù)載的考驗(yàn)。有報(bào)告表明Nginx單機(jī)能支撐高達(dá) 50,000個(gè)并發(fā)連接數(shù)。
15.1 RHEL/Rocky 通過(guò)yum安裝
1)編輯源
vi /etc/yum.repos.d/nginx.repo #內(nèi)容如下
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
2)安裝
yum install -y nginx
3)啟動(dòng)
systemctl start nginx
15.2Ubuntu通過(guò)apt安裝
1)安裝依賴
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
2)導(dǎo)入官方key
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
3)設(shè)置源
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
4)設(shè)置倉(cāng)庫(kù)優(yōu)先級(jí),保證優(yōu)先使用Nginx官方的源
echo -e "Package: * Pin: origin nginx.org Pin: release o=nginx Pin-Priority: 900 " | sudo tee /etc/apt/preferences.d/99nginx
5)安裝
sudo apt update sudo apt install nginx
6)啟動(dòng)
sudo systemctl start nginx
15.3 源碼編譯
1)下載源碼
cd /usr/local/src sudo curl -O http://nginx.org/download/nginx-1.23.0.tar.gz
2)解壓
sudo tar zxf nginx-1.23.0.tar.gz cd nginx-1.23.0
3)安裝依賴
## RHEL/Rocky sudo yum install -y gcc make pcre-devel zlib-devel openssl-devel ##ubuntu sudo apt install -y gcc make libpcre++-dev libssl-dev zlib1g-dev
4)配置
sudo ./configure --prefix=/usr/local/nginx --with-http_ssl_module
5)編譯和安裝
sudo make && sudo make install
6)編輯system服務(wù)管理腳本
sudo vi /lib/systemd/system/nginx.service #寫(xiě)入如下內(nèi)容 [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /usr/local/nginx/logs/nginx.pid)" ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /usr/local/nginx/logs/nginx.pid)" [Install] WantedBy=multi-user.target
7)加載服務(wù)
sudo systemctl daemon-reload
8)啟動(dòng)服務(wù)
sudo systemctl start nginx
15.4 Nginx常見(jiàn)配置
15.4.1 Nginx虛擬主機(jī) 一個(gè)Nginx服務(wù)下,可以配置多個(gè)虛擬主機(jī),每一個(gè)虛擬主機(jī)代表著一個(gè)網(wǎng)站,我們可以使用域名來(lái)區(qū)分每一個(gè)虛擬主機(jī)。 虛擬主機(jī)在配置文件里,就是每一個(gè)server { }配置段,配置示例:
mkdir /usr/local/nginx/conf/vhostsvi /usr/local/nginx/conf/vhosts/123.conf #內(nèi)容如下 server { listen 8080; server_name www.123.com; location / { root /tmp/123.com; index index.html index.htm; } }在虛擬主機(jī)中有一個(gè)默認(rèn)虛擬主機(jī)的概念,所謂默認(rèn)虛擬主機(jī)就是任何域名解析過(guò)來(lái),都會(huì)訪問(wèn)到那個(gè)虛擬主機(jī)里。相同端口的第一個(gè)虛擬主機(jī)為默認(rèn)虛擬主機(jī),還可以手動(dòng)配置 default_server:
listen 80 default_server;安全考慮,默認(rèn)虛擬主機(jī)禁止訪問(wèn),增加配置
deny all;
15.4.2 配置日志
日志分為錯(cuò)誤日志和訪問(wèn)日志,如果Nginx服務(wù)出現(xiàn)問(wèn)題,就需要查看錯(cuò)誤日志來(lái)分析問(wèn)題原因。而訪問(wèn)日志記錄了用戶訪問(wèn)Nginx服務(wù)的過(guò)程,訪問(wèn)日志會(huì)記錄客戶端IP、訪問(wèn)時(shí)間、訪問(wèn)目標(biāo)大小、訪問(wèn)地址、客戶端代理標(biāo)識(shí)、客戶端referer等信息,這些信息也可以自定義。 先來(lái)看錯(cuò)誤日志,配置參數(shù)格式:error_log /path/to/log level。這個(gè)level指的是錯(cuò)誤日志級(jí)別,常見(jiàn)的錯(cuò)誤日志級(jí)別有debug | info | notice | warn | error | crit | alert | emerg。級(jí)別越高記錄的信息越少,如果不定義,默認(rèn)級(jí)別為error。當(dāng)排查問(wèn)題時(shí),可能會(huì)調(diào)整錯(cuò)誤日志級(jí)別,因?yàn)橹挥姓{(diào)整到可以輸出更多信息的日志級(jí)別,才能看到想要的日志信息。 Nginx錯(cuò)誤日志示例:
error_log /var/log/nginx/error.log crit;如果要想徹底關(guān)閉error_log,需要這樣配置:
error_log /dev/null;再來(lái)看訪問(wèn)日志access_log,關(guān)于訪問(wèn)日志,有一個(gè)log_format的配置,它用來(lái)定義訪問(wèn)日志的格式,也就是說(shuō)通過(guò)這個(gè)日志格式來(lái)定義記錄哪些信息,配置示例:
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]' '$host "$request_uri" $status' '"$http_referer" "$http_user_agent"';
這個(gè)combined_realip就是日志格式的名字,可以在access_log配置段引用:
access_log /data/logs/nginx/www.aminglinux.com-access.log combined_realip;
關(guān)于日志格式,各個(gè)變量的含義,阿銘給大家準(zhǔn)備了一個(gè)表格:
變量 | 說(shuō)明 |
$remote_addr | 客戶端(用戶)IP地址 |
$status | 請(qǐng)求狀態(tài)碼,如200,404,301,302等 |
$request | 請(qǐng)求方式(GET或者POST等)+URL(包含$request_method,$host,$request_uri) |
$http_user_agent | 用戶瀏覽器標(biāo)識(shí) |
$http_host | 請(qǐng)求的url地址(目標(biāo)url地址)的host |
$host | 等同于$http_host |
$http_referer | 來(lái)源頁(yè)面,即從哪個(gè)頁(yè)面轉(zhuǎn)到本頁(yè),如果直接在瀏覽器輸入網(wǎng)址來(lái)訪問(wèn),則referer為空 |
$uri | 請(qǐng)求中的當(dāng)前URI(不帶請(qǐng)求參數(shù),參數(shù)位于$args),不同于瀏覽器傳遞的$request_uri的值,它可以通過(guò)內(nèi)部重定向,或者使用index指令進(jìn)行修改。 |
$document_uri | 等同于$uri |
$request_uri | 比$uri多了參數(shù),即$uri+$args |
$http_x_forwarded_for | 如果使用了代理,這個(gè)參數(shù)會(huì)記錄代理服務(wù)器的ip和客戶端的ip |
15.4.3 日志切割
日志如果不做切割,那么會(huì)一直寫(xiě),直到將整個(gè)磁盤(pán)寫(xiě)滿。阿銘曾經(jīng)遇到過(guò)一臺(tái)Nginx服務(wù)器上沒(méi)有配置日志切割,導(dǎo)致訪問(wèn)日志寫(xiě)了幾百個(gè)G,這是非常不負(fù)責(zé)任的。
Nginx的日志切割可以借助Linux系統(tǒng)的logrotate服務(wù)來(lái)完成,你只需要寫(xiě)一個(gè)配置文件即可:
#假設(shè)Nginx的錯(cuò)誤日志和訪問(wèn)日志,都放到了/data/logs/nginx/下 cat > /etc/logrotate.d/nginx <說(shuō)明:/dev/null) 2>/dev/null endscript } EOF
daily表示每天切割
rotate 30表示日志保留30天
missingok表示忽略錯(cuò)誤
notifempty表示如果日志為空,不切割
compress表示壓縮
sharedscripts和endscript中間可以引用系統(tǒng)的命令
postrotate表示當(dāng)切割之后要執(zhí)行的命令
15.4.4 SSL配置
SSL也就是https,配置https只需要兩行配置,但是需要我們提前準(zhǔn)備一對(duì)SSL證書(shū),這個(gè)證書(shū)可以申請(qǐng)一個(gè)免費(fèi)的,也可以自簽。如果你有自己的域名,建議去申請(qǐng)一個(gè)免費(fèi)的證書(shū),推薦https://freessl.cn。如果沒(méi)有自己域名,那么就自簽吧,具體步驟可以參考https://github.com/aminglinux/nginx/blob/master/ssl/key.md。
配置示例:
server { listen443ssl; server_namewww.123.com; ssl_certificatessl/server.crt; ssl_certificate_keyssl/server.key; location/{ root /tmp/123.com; index index.html index.htm; } }說(shuō)明:
443端口為ssl監(jiān)聽(tīng)端口。
ssl_certificate指定crt文件所在路徑,如果寫(xiě)相對(duì)路徑,必須把該文件和nginx.conf文件放到一個(gè)目錄下。
ssl_certificate_key指定key文件所在路徑。
15.4.5 反向代理
Nginx在日常的工作中絕大多數(shù)都是作為反向代理在提供服務(wù)。比較典型的場(chǎng)景是:域名沒(méi)有備案,可以把域名解析到香港一臺(tái)云主機(jī)上,在香港云主機(jī)做個(gè)代理,而網(wǎng)站數(shù)據(jù)是在大陸的服務(wù)器上。 配置示例:
server { listen 80; server_name aminglinux.com; location / { proxy_pass http://123.23.13.11/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }說(shuō)明:proxy_pass后面跟的url就是被代理服務(wù)器的地址。下面的三個(gè)proxy_set_header是一個(gè)固定配置,一直帶著便是。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11320瀏覽量
209833 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9233瀏覽量
85626 -
nginx
+關(guān)注
關(guān)注
0文章
151瀏覽量
12189
原文標(biāo)題:Nginx入門
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論