Nginx介紹
1.Nginx是一款開(kāi)源的讥电,支持高性能,高并發(fā)的www.服務(wù)和代理服務(wù)軟件
Nginx (“engine x”) 是一個(gè)開(kāi)源的轧抗、支持高性能恩敌、高并發(fā)的WWW服務(wù)和代理服務(wù)軟件。
它是由俄羅斯人IgorSysoev開(kāi)發(fā)的横媚,最初被應(yīng)用在俄羅斯的大型網(wǎng)站www.rambler.ru上纠炮。
后來(lái)作者將源代碼以類(lèi)BSD許可證的形式開(kāi)源出來(lái)供全球使用月趟。
3 月 11 日,F(xiàn)5 與 NGINX 宣布了一項(xiàng)最終協(xié)議恢口,根據(jù)該協(xié)議孝宗,F(xiàn)5 將收購(gòu) NGINX 的所有已發(fā)行股票,總價(jià)值約為 6.7 億美元耕肩。
F5 是應(yīng)用交付網(wǎng)絡(luò)(ADN)領(lǐng)域的全球領(lǐng)先廠商因妇,其解決方案有助于整合不同的技術(shù),以便更好地控制基礎(chǔ)架構(gòu)看疗,提高應(yīng)用交付和數(shù)據(jù)管理能力沙峻,并使用戶(hù)能夠通過(guò)企業(yè)桌面系統(tǒng)和智能設(shè)備無(wú)縫、安全并更快速地接入應(yīng)用两芳。
而 NGINX 最知名產(chǎn)品 Nginx 是互聯(lián)網(wǎng)上最受歡迎的 Web 服務(wù)器之一摔寨,NGINX 提供一整套用于開(kāi)發(fā)和交付現(xiàn)代應(yīng)用的技術(shù),同時(shí)它也是應(yīng)用交付領(lǐng)域的開(kāi)源領(lǐng)導(dǎo)者怖辆。
收購(gòu)聲明指出是复,此次戰(zhàn)略收購(gòu)和有機(jī)投資,將確保長(zhǎng)期收入和每股盈利增長(zhǎng)竖螃;F5 和 NGINX 將在所有環(huán)境中實(shí)現(xiàn)多云應(yīng)用服務(wù)淑廊,提供開(kāi)發(fā)人員所需的易用性和靈活性,同時(shí)還提供網(wǎng)絡(luò)運(yùn)營(yíng)團(tuán)隊(duì)所需的規(guī)模特咆、安全性和可靠性等能力季惩。
收購(gòu)?fù)瓿珊螅琋ginx 管理層將加入 F5腻格,現(xiàn)有的辦事處也將繼續(xù)保持開(kāi)放画拾。為了收購(gòu) Nginx,F(xiàn)5 Networks 籌集了 1.03 億美元的資金菜职,投資者中包括高盛青抛、澳洲電信風(fēng)投、以及新企業(yè)協(xié)會(huì)酬核。
2.Nginx3大主要功能
1)網(wǎng)頁(yè)服務(wù):自身是靜態(tài) web服務(wù)apache,lighttpd, IIs
還支持動(dòng)態(tài)web服務(wù)
PHP(fastcgi _pass)JAVA(proxy_pass) Python(uwsgi_pass)
2)負(fù)載均衡\反向代理haproxy,lvs, F5,netscaler.
只支持http,現(xiàn)在tcp/udp蜜另。
3)緩存服務(wù)器 squid, varnish
3.特點(diǎn):
2008年才開(kāi)始使用,當(dāng)時(shí)Apache是老大
使用量 Apache43% Nginx 42%
靜態(tài)小文件高并發(fā)嫡意,占用資源少举瑰,軟件本身小。
特點(diǎn):靜態(tài)小文件高并發(fā),占用資源少蔬螟。軟件本身小此迅。
3、企業(yè)面試時(shí)需要解答如下Nginx HTTP服務(wù)器的特色及優(yōu)點(diǎn):
1)支持高并發(fā):能支持幾萬(wàn)并發(fā)連接(特別是靜態(tài)小文件業(yè)務(wù)環(huán)境)
2)資源消耗少:在3萬(wàn)并發(fā)連接下,開(kāi)啟10個(gè)Nginx線程消耗不到200MB內(nèi)存。
3)可以做HTTP反向代理及加速緩存,即負(fù)載均衡功能,內(nèi)置對(duì)Rs節(jié)點(diǎn)服務(wù)器健康檢查功能,這相當(dāng)于專(zhuān)業(yè)的haproxy軟件或1vs的功能具備squid等專(zhuān)業(yè)緩存軟件等的緩存功能邮屁。
4.Nginx作為web服務(wù)器的主要應(yīng)用場(chǎng)景:
1)靜態(tài)web服務(wù)器
使用Nginx運(yùn)行HTML. JS.CsS整袁、小圖片等靜態(tài)數(shù)據(jù)(此功能類(lèi)似lighttpd軟件)。
2)配合運(yùn)行動(dòng)態(tài)Web服務(wù)器:
Nginx結(jié)合FastCGI運(yùn)行PHP等動(dòng)態(tài)程序(例如使用fastcgi pass方式)
Nginx結(jié)合proxy pass支持Java動(dòng)態(tài)程序(tomcat/resin服務(wù))佑吝。
Nginx結(jié)合uwsgi pass支持Python坐昙。
3)反向代理/負(fù)載均衡
4)做web緩存服務(wù)器(把文件放入內(nèi)存里)。
京東之前就是用Nginx做web緩存
5.反向代理與負(fù)載均衡
代理:海外代購(gòu),微商:代理:代替別人做事芋忿。
正向代理:由內(nèi)向外炸客。代替效率低代替局域網(wǎng)內(nèi)PC,請(qǐng)求外部應(yīng)用服務(wù)。
反向代理:由外向內(nèi)代替效率低代替外部的用戶(hù)請(qǐng)求內(nèi)部的應(yīng)用服務(wù)器戈钢。
負(fù)載均衡:轉(zhuǎn)發(fā)痹仙。甩手掌柜。效率高
6·為什么Nginx總體性能比Apache高?
Nginx使用最新的epoll (Linux2.6內(nèi)核)和kqueue (freebsd)異步網(wǎng)絡(luò)1/0模型,而Apache則使用的是傳統(tǒng)的select模型殉了。目前1inux下能夠承受高并發(fā)訪問(wèn)的Squid. Memcached軟件都采用的是epol1模型.
Apache則使用的是傳統(tǒng)的select模型,Nginx使用最新的epol1模型1
select模型:伙伴去宿舍找你开仰,一個(gè)一個(gè)找。薪铜。效率低
epoll模型:伙伴去宿舍找你众弓,先問(wèn)宿管大媽?zhuān)匆幌履阍谀拈g宿舍,然后直接去你宿舍找你隔箍。谓娃。效率高。
7.軟件安裝
Linux系統(tǒng)如何安裝軟件?
1蜒滩、rpm安裝簡(jiǎn)單快滨达。依賴(lài)多,解決依賴(lài)?yán)щy繁瑣。
2俯艰、yum安裝*****簡(jiǎn)單快, 自動(dòng)解決依賴(lài)捡遍。不能選擇軟件版本或軟件存放路徑。
3蟆炊、編安裝(源碼編譯) *****.慢復(fù)雜需要GCC編譯器,可以自定義安裝(版本稽莉、軟件路徑)
4瀑志、將源碼制作成rpm,然后放到y(tǒng)um倉(cāng)庫(kù),實(shí)現(xiàn)yum自動(dòng)安裝涩搓。一次性慢復(fù)雜,安裝快,可以自定義安裝(版本、軟件路徑)
5劈猪、二進(jìn)制安裝
8.Nginx安裝兩種方法:
yum安裝:
epel源:版本低
nginx官方源:版本高
8.1編譯安裝:
1,安裝Nginx所需的pcre庫(kù)Pcre全稱(chēng)(Perl Compatible Regular Expressions) ,中文"perl兼容正則表達(dá)式",官方站點(diǎn)為http://www.pcre.org/,安裝pcre庫(kù)是為了使Nginx支持具備URI重寫(xiě)功能的 Rewrite模塊,如果不安裝pcre庫(kù),則Nginx無(wú)法使用Rewrite模塊功能, Nginx的Rewrite模塊功能幾乎是企業(yè)應(yīng)用必須昧甘。安裝pcre庫(kù)的過(guò)程如下
8.2 編譯安裝(和8.1二選一)
pcre:URL重寫(xiě)軟件,即實(shí)現(xiàn)偽靜態(tài)需要這個(gè)軟件
下載:
mkdir -p /server/tools
cd /server/tools
wget http://nginx.org/download/nginx-1.16.0.tar.gz
安裝依賴(lài)战得。
yum install pcre pcre-devel -y
yum install openssl openssl-devel -y #https加密用他充边。
編譯安裝步驟
tar xf nginx-1.16.0.tar.gz
cd nginx-1.16.0/
useradd -s /sbin/nologin www -M
id www
./configure --user=www --group=www --prefix=/application/nginx-1.16.0/ --with-http_stub_status_module --with-http_ssl_module --with-pcre
make
make install
ln -s /application/nginx-1.16.0/ /application/nginx
/application/nginx/sbin/nginx
netstat -lntup|grep nginx
注意:
1)每一步結(jié)尾直接echo $?驗(yàn)證是否正確。返回0代表步驟正確
2)驗(yàn)證最終的安裝是否正確。
wget 10.0.0.8
curl 10.0.0.8
configure參數(shù)的作用
參數(shù) | 意思 |
---|---|
--prefix=PATH | 路徑 |
--user=USER | 用戶(hù) |
--group=GROUP | 組 |
--with-pcre | 偽靜態(tài) |
--with-http_stub_status_module | 狀態(tài) |
--with-http_ssl_module | 加密 443 |
編譯安裝配置:
[root@web02 /application/nginx]# tree
.
├── conf
│ ├── fastcgi.conf #和動(dòng)態(tài)服務(wù)的接口配置參數(shù)浇冰,配合php
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types #媒體類(lèi)型
│ ├── mime.types.default
│ ├── nginx.conf #主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default #和動(dòng)態(tài)服務(wù)的接口配置參數(shù)
│ ├── uwsgi_params
│ ├── uwsgi_params.default #和動(dòng)態(tài)服務(wù)的接口配置參數(shù)贬媒,配合Python
│ └── win-utf
├── fastcgi_temp
├── html #默認(rèn)站點(diǎn)目錄。
│ ├── 50x.html
│ └── index.html #默認(rèn)的首頁(yè)肘习,10.0.0.8不指定文件际乘,默認(rèn)加載index.html首頁(yè)。
├── logs
│ ├── access.log #訪問(wèn)日志
│ ├── error.log #Nginx錯(cuò)誤日志漂佩。
│ └── nginx.pid #進(jìn)程號(hào)對(duì)應(yīng)文件脖含。
├── sbin
│ └── nginx #啟動(dòng)命令。
yum安裝配置路徑:
[root@web01 ~]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
實(shí)驗(yàn)一下
編譯為主:編譯后需要平滑重啟一下
[root@web01 /application/nginx/html]# vim index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HTML5 Canvas 花邊圖案 | 齒形花邊</title>
<style>
body {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
overflow: hidden;
margin: 0;
background: black;
-webkit-filter: invert(0);
filter: invert(0);
}
#canvas {
position: absolute;
z-index: -1;
-webkit-filter: hue-rotate(100deg) brightness(1);
filter: hue-rotate(100deg) brightness(1);
mix-blend-mode: difference;
}
#canv {
position: absolute;
z-index: -2;
mix-blend-mode: lighter;
}
canvas {
position: absolute;
top: 50%;
left: 50%;
z-index: -1;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
</style>
</head>
<body>
<canvas id='canvas'></canvas>
<canvas id='canv'></canvas>
<script>
var c = document.getElementById('canv'),
$ = c.getContext('2d'),
w = c.width = window.innerWidth,
h = c.height = window.innerHeight,
t = 0,
num = 950,
s, a, b, u = 0,
x, y, _x, _y,
_t = 1 / 16;
function random(min, max) {
return Math.random() * (max - min) + min;
}
var anim = function() {
$.globalCompositeOperation = 'multiply';
$.fillStyle = 'hsla(258,20%,50%,1)';
$.fillRect(0, 0, w, h);
$.globalCompositeOperation = 'lighter';
for (var i = 0; i < .5; i++) {
x = 0;
_u = (u) + i * 2, col = u + (_u * 8);
$.beginPath();
for (var j = 0; j < num; j++) {
x -= .312 * Math.sin(15);
y = x * Math.sin(i + 3.05 * t + x / 7) / 12;
_x = x * Math.cos(b) + y * Math.sin(b);
_y = x * Math.sin(b) - y * Math.cos(b);
b = (j * 2.1102) * Math.PI / -.1008;
$.arc(w / 2 - _x, h / 2 - _y, random(.001, .6), 300, Math.PI * 2 + .1);
$.lineWidth = .2;
}
var g = $.createLinearGradient(w / 2 + _x, h / 2 + _y,
1, w / 2 + _x, h / 2 + _y);
g.addColorStop(0.2, 'hsla(' + col + ',90%,50%,.2)');
g.addColorStop(0.9, 'hsla(' + _u + ',95%,50%,.3)');
g.addColorStop(1, 'hsla(0,0%,100%,.4)');
$.strokeStyle = g;
$.stroke();
}
t += _t / 2;
u -= .2;
window.requestAnimationFrame(anim);
};
anim();
window.addEventListener('resize', function() {
c.width = w = window.innerWidth;
c.height = h = window.innerHeight;
}, false);
var canvas, ctx, tim;
canvas = document.getElementsByTagName('canvas')[0];
ctx = canvas.getContext('2d');
canvas.width = canvas.height = 400;
baum();
function baum() {
var a, b, c, d, e, x, y, r;
ctx.globalCompositeOperation = "source-over";
ctx.fillStyle = "hsla(26,100%,0%,1)";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.globalCompositeOperation = "color-burn";
tim = new Date().getTime() / Math.PI / 72;
c = [];
r = tim / 32;
for (a = 0; a < 18; a++) {
b = 160;
if (a % 2 == 1) b = 100;
x = Math.cos(r) * b;
y = Math.sin(r) * b;
c.push([200 + x, 200 + y]);
r += Math.PI * 2 / 14;
}
for (a = 0; a < 7; a++) {
b = c[a * 2];
d = c[a * 2 + 1];
e = c[(a * 2 + 13) % 14];
tri([
[200, 200], b, d
], 0);
tri([
[200, 200], b, e
], 0);
}
requestAnimationFrame(baum);
}
function tri(p, ban) {
var a, b, c, d, e, f, x, y, han, r1, r2;
x = y = 0;
for (a = 0; a < 3; a++) {
x += p[a][0];
y += p[a][1];
}
x = x / 3 - canvas.width / 2;
y = y / 3 - canvas.height / 2;
han = Math.pow(x * x + y * y, 0.5);
c = 0.2 + Math.sin(tim / 13) * 0.15;
r1 = 0.5 + Math.sin(han / 20 * (1 + Math.sin(tim / 19) * 0.7) + tim / 41) * c;
r2 = 1 - r1;
c = p[0][0] * (p[1][1] - p[2][1]);
c += p[1][0] * (p[2][1] - p[0][1]);
c += p[2][0] * (p[0][1] - p[1][1]);
c = Math.abs(c);
if (c < 100) {
if (ban % 17 == 1) {
a = ((han + tim * 3) % 360) | 0;
b = 0.4;
if (ban % 12 > 8) b = 1;
ctx.fillStyle = ctx.strokeStyle = "hsla(" + a * 2 + ",60%,40%,0.53)";
ctx.beginPath();
for (a = 0; a < p.length; a++) {
b = p[a];
ctx.globalCompositeOperation = "lighter";
ctx.lineTo(b[0], b[1]);
}
ctx.fill();
if (Math.random() < 0.2) return;
}
if (ban % 50 > 28) return;
if (c < 20) return;
}
d = 0;
for (a = 0; a < p.length; a++) {
b = p[a];
c = p[(a + 1) % p.length];
x = b[0] - c[0];
y = b[1] - c[1];
e = Math.pow(x * x + y * y, 0.5);
if (e > d) {
d = e;
f = a;
}
}
a = p[f];
b = p[(f + 1) % p.length];
c = p[(f + 2) % p.length];
x = a[0] * r1 + b[0] * r2;
y = a[1] * r1 + b[1] * r2;
tri([b, c, [x, y]], ban + 1);
tri([c, a, [x, y]], ban + 2);
}
</script>
</body>
</html>
在瀏覽器上輸入自己的本機(jī)ip
如圖: