nginx介紹
Nginx是俄羅斯人編寫的十分輕量級(jí)的HTTP服務(wù)器,Nginx,它的發(fā)音為“engine X”,是一個(gè)高性能的HTTP和反向代理服務(wù)器,同時(shí)也是一個(gè)IMAP/POP3/SMTP 代理服務(wù)器。Nginx是由俄羅斯人 Igor Sysoev為俄羅斯訪問量第二的 Rambler.ru站點(diǎn)開發(fā)的,它已經(jīng)在該站點(diǎn)運(yùn)行超過兩年半了。Igor Sysoev在建立的項(xiàng)目時(shí),使用基于BSD許可。
nginx和apache區(qū)別
Nginx
- 輕量級(jí),采用 C 進(jìn)行編寫,同樣的 web 服務(wù),會(huì)占用更少的內(nèi)存及資源
- 抗并發(fā),nginx 以 epoll and kqueue 作為開發(fā)模型,處理請(qǐng)求是異步非阻塞的,負(fù)載能力比 apache 高很多,而 apache 則是阻塞型的。在高并發(fā)下 nginx 能保持低資源低消耗高性能 ,而 apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現(xiàn)進(jìn)程數(shù)飆升,從而拒絕服務(wù)的現(xiàn)象。
- nginx 處理靜態(tài)文件好,靜態(tài)處理性能比 apache 高三倍以上
- nginx 的設(shè)計(jì)高度模塊化,編寫模塊相對(duì)簡(jiǎn)單
- nginx 配置簡(jiǎn)潔,正則配置讓很多事情變得簡(jiǎn)單,而且改完配置能使用 -t 測(cè)試配置有沒有問題,apache 配置復(fù)雜 ,重啟的時(shí)候發(fā)現(xiàn)配置出錯(cuò)了,會(huì)很崩潰
- nginx 作為負(fù)載均衡服務(wù)器,支持 7 層負(fù)載均衡
- nginx 本身就是一個(gè)反向代理服務(wù)器,而且可以作為非常優(yōu)秀的郵件代理服務(wù)器
- 啟動(dòng)特別容易, 并且?guī)缀蹩梢宰龅?7*24 不間斷運(yùn)行,即使運(yùn)行數(shù)個(gè)月也不需要重新啟動(dòng),還能夠不間斷服務(wù)的情況下進(jìn)行軟件版本的升級(jí)
- 社區(qū)活躍,各種高性能模塊出品迅速
Apache
- apache 的 rewrite 比 nginx 強(qiáng)大,在 rewrite 頻繁的情況下,用 apache
- apache 發(fā)展到現(xiàn)在,模塊超多,基本想到的都可以找到
- apache 更為成熟,少 bug ,nginx 的 bug 相對(duì)較多
- apache 超穩(wěn)定
- apache 對(duì) PHP 支持比較簡(jiǎn)單,nginx 需要配合其他后端用
- apache 在處理動(dòng)態(tài)請(qǐng)求有優(yōu)勢(shì),nginx 在這方面是雞肋,一般動(dòng)態(tài)請(qǐng)求要 apache 去做,nginx 適合靜態(tài)和反向。
apache 仍然是目前的主流,擁有豐富的特性,成熟的技術(shù)和開發(fā)社區(qū)
總結(jié)
兩者最核心的區(qū)別在于 apache 是同步多進(jìn)程模型,一個(gè)連接對(duì)應(yīng)一個(gè)進(jìn)程,而 nginx 是異步的,多個(gè)連接(萬級(jí)別)可以對(duì)應(yīng)一個(gè)進(jìn)程,一般來說,需要性能的 web 服務(wù),用 nginx 。如果不需要性能只求穩(wěn)定,更考慮 apache ,后者的各種功能模塊實(shí)現(xiàn)得比前者,例如 ssl 的模塊就比前者好,可配置項(xiàng)多。epoll(freebsd 上是 kqueue ) 網(wǎng)絡(luò) IO 模型是 nginx 處理性能高的根本理由,但并不是所有的情況下都是 epoll 大獲全勝的,如果本身提供靜態(tài)服務(wù)的就只有寥寥幾個(gè)文件,apache 的 select 模型或許比 epoll 更高性能。當(dāng)然,這只是根據(jù)網(wǎng)絡(luò) IO 模型的原理作的一個(gè)假設(shè),真正的應(yīng)用還是需要實(shí)測(cè)了再說的。
更為通用的方案是,前端 nginx 抗并發(fā),后端 apache 集群,配合起來會(huì)更好。
集群
簡(jiǎn)單來說,集群就是指一組相互獨(dú)立的計(jì)算機(jī),利用高速通信網(wǎng)絡(luò)組成的一個(gè)較大的計(jì)算機(jī)服務(wù)系統(tǒng),每個(gè)集群節(jié)點(diǎn)都是運(yùn)行各自服務(wù)的獨(dú)立服務(wù)器。這些服務(wù)器之間可以彼此通信,協(xié)同向用戶提供應(yīng)用程序、系統(tǒng)資源和數(shù)據(jù),并以單一系統(tǒng)的模式加以管理。當(dāng)用戶客戶機(jī)請(qǐng)求集群系統(tǒng)時(shí),集群給用戶的感覺就是一個(gè)單一的服務(wù)器,而實(shí)際上用戶請(qǐng)求的是一組集群服務(wù)器。
集群主要包括幾大特點(diǎn):高性能、價(jià)格有效性、可伸縮性、高可用性、透明性、可管理性和可編程性。
負(fù)載均衡集群
常見的負(fù)載均衡的架構(gòu)包括有負(fù)載均衡集群、高可用性集群、高性能計(jì)算集群等等。這里著重介紹負(fù)載均衡集群,其他的集群方式不做介紹。負(fù)載均衡集群為企業(yè)提供了更為實(shí)用、性價(jià)比更高的系統(tǒng)架構(gòu)解決方案。負(fù)載集群可以把很多客戶集中的訪問請(qǐng)求負(fù)載壓力盡可能平均分?jǐn)偟接?jì)算機(jī)集群中處理??蛻粼L問請(qǐng)求負(fù)載均衡通常包含應(yīng)用程序處理負(fù)載均衡和網(wǎng)絡(luò)流量負(fù)載。這樣的系統(tǒng)非常適合使用同一組應(yīng)用程序?yàn)榇罅坑脩籼峁┓?wù)的模式,每個(gè)節(jié)點(diǎn)都可以承當(dāng)一定的訪問請(qǐng)求負(fù)載壓力,并且可以實(shí)現(xiàn)訪問請(qǐng)求在各節(jié)點(diǎn)之間動(dòng)態(tài)分配,以實(shí)現(xiàn)負(fù)載均衡。負(fù)載均衡集群運(yùn)行時(shí),一般是通過一個(gè)或多個(gè)前端負(fù)載均衡器將客戶訪問請(qǐng)求分發(fā)到后端的一組服務(wù)器上,從而達(dá)到整個(gè)系統(tǒng)的高性能和高可用性。一般高可用性集群和負(fù)載均衡集群使用類似的技術(shù),或同事具有高可用與負(fù)載均衡的特點(diǎn)。負(fù)載均衡的作用為:分擔(dān)用戶訪問及數(shù)據(jù)流量、保持業(yè)務(wù)的連續(xù)性、應(yīng)用于Web業(yè)務(wù)及數(shù)據(jù)庫從庫等服務(wù)器的業(yè)務(wù)。
Nginx負(fù)載均衡集群介紹
互聯(lián)網(wǎng)企業(yè)中常見的開源集群軟件有:Nginx、LVS、Haproxy、Keepalived等,硬件有F5、Netscaler等。嚴(yán)格地說,Nginx僅僅是作為Nginx Proxy反向代理使用的,因?yàn)榉聪虼砉δ鼙憩F(xiàn)的效果是負(fù)載均衡集群的效果,所以也叫做Nginx負(fù)載均衡。反向代理和負(fù)載均衡的區(qū)別在于負(fù)載均衡通常都是對(duì)請(qǐng)求的數(shù)據(jù)包的轉(zhuǎn)發(fā)(也有可能會(huì)改寫數(shù)據(jù)包)、傳遞,其中DR模式明顯的特征就是從負(fù)載均衡下面的節(jié)點(diǎn)服務(wù)器來看,接收到的請(qǐng)求還是來自負(fù)載均衡器的客戶端的真實(shí)用戶。而反向代理,反向代理接收訪問用戶的請(qǐng)求后,會(huì)代理用戶重新發(fā)起請(qǐng)求代理下的節(jié)點(diǎn)服務(wù)器,最后把數(shù)據(jù)返回給客戶端用戶。在節(jié)點(diǎn)服務(wù)器來看,訪問節(jié)點(diǎn)服務(wù)器的客戶端用戶是反向代理服務(wù)器,而不是真實(shí)的網(wǎng)站訪問用戶。Nginx負(fù)載均衡的模塊主要有兩個(gè),ngx_http_proxy_module,ngx_http_upstream_module。編譯的時(shí)候需要把這兩個(gè)模塊編譯進(jìn)去。
nginx安裝
第一步:配置網(wǎng)絡(luò)yum源
[local]
name=local
enabled=1
gpgcheck=0
baseurl=file:///mnt
[epel]
name=epel
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/
第二步:下載nginx
[root@ken yum.repos.d]# yum install nginx -y
第三步:?jiǎn)?dòng)nginx
[root@ken yum.repos.d]# systemctl restart nginx
驗(yàn)證防火墻作用:
第一步:防火墻關(guān)閉狀態(tài)下下訪問瀏覽器
可以正常訪問到
第二步:開啟防火墻
[root@ken yum.repos.d]# systemctl restart nginx^C
[root@ken yum.repos.d]# 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)
[root@ken yum.repos.d]# systemctl restart firewalld
[root@ken yum.repos.d]# systemctl status firewalld
● firewalld.service – firewalld – dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2019-05-27 10:36:17 CST; 1min 5s ago
Docs: man:firewalld(1)
Main PID: 2219 (firewalld)
CGroup: /system.slice/firewalld.service
└─2219 /usr/bin/python -Es /usr/sbin/firewalld –nofork –nopid
May 27 10:36:16 ken systemd[1]: Starting firewalld – dynamic firewall daemon…
May 27 10:36:17 ken systemd[1]: Started firewalld – dynamic firewall daemon.
第三步:訪問瀏覽器
發(fā)現(xiàn)已經(jīng)無法正常訪問
第四步:設(shè)置防火墻規(guī)則,放行80端口
[root@ken yum.repos.d]# iptables -I INPUT -p tcp -d 192.168.64.4 -j ACCEPT
第五步:瀏覽器再次查看
發(fā)現(xiàn)可以正常訪問
nginx配置文件詳解
主配置文件的位置:etc/nginx/nginx.conf
1.幾個(gè)概念
反向代理:在收到客戶端請(qǐng)求之后,會(huì)修目標(biāo)IP地址和端口
正向代理:在收到客戶端請(qǐng)求之后,會(huì)修源IP地址和端口
上游服務(wù)器:代理服務(wù)器后端的哪些真正給客戶端提供服務(wù)的節(jié)點(diǎn),這樣的服務(wù)器稱之為上游服務(wù)器
下游服務(wù)器:客戶端就是下游節(jié)點(diǎn)
nginx反向代理–動(dòng)靜分離
192.168.64.4 主服務(wù)器
192.168.64.5 靜態(tài)節(jié)點(diǎn)
192.168.64.7 動(dòng)態(tài)節(jié)點(diǎn)
第一步:在主服務(wù)器部署nginx并配置動(dòng)靜分離規(guī)則
location ~ html$ {
proxy_pass http://192.168.64.5;
}
location ~ php$ {
proxy_pass http://192.168.64.7;
}
第二步:檢測(cè)語法重啟nginx
[root@ken html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ken html]# systemctl restart nginx
第二步:配置靜態(tài)服務(wù)器
第三步:配置動(dòng)態(tài)服務(wù)器
[root@ken html]# yum install php httpd -y
編輯/var/www/html/index.php
<?php
phpinfo();
?>
第四步:瀏覽器訪問主服務(wù)器
略
nginx反向代理–不完全代理
第一步:編輯nginx文件,編輯規(guī)則
location /admin{
proxy_pass http://192.168.64.5;
}
第二步:檢測(cè)并重啟
[root@ken html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ken html]# systemctl restart nginx
第三步:瀏覽器訪問
訪問不到
第四步:創(chuàng)建文件
[root@ken html]# mkdir admin
[root@ken html]# echo “56566” > admin/index.html
第五步:瀏覽器再次訪問
訪問成功
總結(jié):不完全代理的話location后面定義的訪問uri會(huì)自動(dòng)填補(bǔ)到IP地址的后面,location /admin{
proxy_pass http://192.168.64.5;
}
比如上面這個(gè)規(guī)則,意思就是http://192.168.64.5/admin
nginx反向代理–完全代理
第一步:編輯nginx文件,編輯規(guī)則
location /admin{
proxy_pass http://192.168.64.5/;
}
第二步:檢測(cè)并重啟
[root@ken html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ken html]# systemctl restart nginx
第三步:瀏覽器訪問
可以訪問
總結(jié):完全代理的話location后面定義的訪問uri不會(huì)自動(dòng)填補(bǔ)到IP地址的后面,location /admin{
proxy_pass http://192.168.64.5/;
}
比如上面這個(gè)規(guī)則,意思就是直接http://192.168.64.5
nginx負(fù)載均衡演示
第一步:編寫規(guī)則
upstream ken {
server 192.168.64.5 weight=6 max_fails=2 fail_timeout=2;
server 192.168.64.7 weight=1 max_fails=2 fail_timeout=2;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html;
Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://ken;
}
第二步:檢查語法并重啟
[root@ken html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ken html]# systemctl restart nginx
第三步:瀏覽器訪問主節(jié)點(diǎn)
略
LNMP架構(gòu)上線網(wǎng)站
第一步:下載相關(guān)的軟件包
[root@ken html]# yum install nginx php php-mysql mariadb-server php-fpm -y
第二步:編輯php匹配規(guī)則
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html;
index index.php index.html;
Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
location ~ php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
}
第三步:檢測(cè)并重啟
[root@ken html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ken html]# systemctl restart nginx
第四步:?jiǎn)?dòng)php-fpm
[centos]
name=centos base
enabled=1
gpgcheck=0
baseurl=http://mirrors.163.com/centos/7/os/x86_64/
[root@ken yum.repos.d]# systemctl restart php-fpm
[root@ken yum.repos.d]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:9000 :
第五步:重啟數(shù)據(jù)庫
[root@ken yum.repos.d]# systemctl restart mariadb
第六步:創(chuàng)建數(shù)據(jù)庫添加用戶
MariaDB [(none)]> create database ken;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all on ken.* to ken@’localhost’ identified by ‘123’;
Query OK, 0 rows affected (0.00 sec)
第七步:上傳wordpress安裝包至nginx網(wǎng)站根目錄下/usr/share/nginx/html 并解壓
[root@ken html]# yum install unzip -y
[root@ken html]# unzip wordpress-3.3.1-zh_CN.zip
第八步:配置數(shù)據(jù)庫文件
[root@ken html]# cp wp-config-sample.php wp-config.php
[root@ken html]# vim wp-config.php
define(‘DB_NAME’, ‘ken’);
/** MySQL 數(shù)據(jù)庫用戶名 /
define(‘DB_USER’, ‘ken’);
/* MySQL 數(shù)據(jù)庫密碼 */
define(‘DB_PASSWORD’, ‘123’);
第九步:瀏覽器訪問
略