1、Nginx是什么
Nginx是HTTP服务器,可将服务器上的静态文件通过HTTP协议展示给客户端。
2、Nginx能做什么有什么优势
客户端假设通过HTTP协议访问A网站中的应用服务器,那么网站管理者可在服务器加一个Nginx(也就是所谓的反向代理),让客户端线先请求Nginx,随后Nginx去请求应用服务器,然后将结果返回给客户端。那么可能会有小伙伴疑惑既然可以直接访问HTTP,那为何要多此一举,去先访问代理呢,这么做就什么好处呢,优势如下。
优势1-支持负载均衡
当一个网站访问量特别大的时候,网站的各种速度都会越来越慢,一台服务器肯定是不够用了。这个时候就需要将应用部署在多台服务器上,将请求平摊给多台服务器来处理。这样的好处是,万一某一台服务器GG了,但只要还有其他的服务器正常运行,就不会影响使用。这个时候就可以通过Nginx反向代理来实现负载均衡。
下面这个配置会将请求轮询分配到服务器中,这样当客户端请求次数多的时候,可以由不同的服务器来处理。
- upstream myapp {
- server192.168.1.1:8080; # 服务器1
- server192.168.1.2:8080; # 服务器2
- server192.168.1.3:8080; # 服务器3
- }
- server {
- listen80;
- location / {
- proxy_pass http://myapp;
- }
- }
- 可以通过ip-hash的方式,根据客户端ip地址的hash值来请求分配给固定的某一个服务器处理。
- upstream myapp {
- ip_hash;
- server192.168.1.1:8080;
- server192.168.1.2:8080;
- server192.168.3.2:8080;
- }
- server {
- listen80;
- location / {
- proxy_pass http://myapp;
- }
- }
- 服务器的硬件会影响他的性能,所以一般把大部分请求分配给好的服务器,把少量请求分配给差的服务器是比较好的一种做法,这个时候我们可以过weight关键字来来控制 weight越大,负载的权重就越大 还可用过max_fails 字段控制请求失败次数:允许请求失败的次数默认为 当超过最大次数时,返回proxy_next_upstream 模块定义的错误 然后通过设置关键字
fail_timeout:max_fails来设置
失败后,暂停的时间 - tream myapp {
- server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=30s;
- server 192.168.2.1:8080 weight=3 max_fails=2 fail_timeout=30s;
- }
- server {
- listen80;
- location / {
- proxy_pass http://myapp;
- }
- }
优势2-虚拟主机
负载均衡虽然很好用,但并不是适合所有的网站,例如有的网站,访问量较小,所以需要节约成本,这个时候就需要将多个网站放在同一台服务器上。例如将A和B两个网站部署在同一台服务器上,然后将两个域名同时解析到一个IP地址,但是要让用户通过两个域名打开两个完全不同的网站,彼此之间不影响,就像访问两个服务器一样,这个时候就像2个虚拟主机。
- server {
- listen80default_server;
- server_name _;
- return444; # 过滤其他域名的请求,返回444状态码
- }
- server {
- listen80;
- server_name a; # a网站域名
- location / {
- proxy_pass http://localhost:8082; # 对应端口号8082
- }
- }
- server {
- listen80;
- server_name b; # b网站域名
- location / {
- proxy_pass http://localhost:8083; # 对应端口号8083
- }
- }
这个时候在服务器8082和8083分别开了一个应用,客户端可以通过不同的域名去访问,根据server_name可以反向代理到对应的应用服务器。
虚拟主机的原理是通过HTTP请求头中的Host是否匹配server_name来实现的,另外server_name配置还可以过滤将某些域名指向你主机服务器的恶意行为。
优势3-FastCGI
Nginx不支持PHP等语言,但是它可以通过FastCGI来将请求扔给某些语言或框架处理(例如PHP、Python、Perl)。
配置中将.php结尾的请求通过FashCGI交给PHP-FPM处理,PHP-FPM是PHP的一个FastCGI管理器。
- server {
- listen80;
- location ~ \.php$ {
- include fastcgi_params;
- fastcgi_param SCRIPT_FILENAME /PHP文件路径$fastcgi_script_name; # PHP文件路径
- fastcgi_pass127.0.0.1:9000; # PHP-FPM地址和端口号
- # 另一种方式:fastcgi_pass unix:/var/run/php5-fpm.sock;
- }
- }