一、Nginx概述(特点)
Nginx (engine x) 是一个轻量级的、高性能的、基于Http的、反向代理服务器,静态web服务器。具有以下特点
1、高并发
一个Nginx服务器在不做任何配置的情况下并发量可达1000左右。在硬件条件允许的前提下,Nginx可以支持高达5-10万的并发量(除了Nginx的设置外,Linux主机需要做大量的设置来配合Nginx)。
对比一下Tomcat。Tomcat服务器默认的并发量为150(不做任何配置)。即,当有超过150个用户同时访问某Servlet时,Tomcat的响应就会变得非常慢
2、低消耗
官方给出的测试结果,10000个非活跃连接,在Nginx中仅消耗2.5M内存。对于一般性的DoS攻击来说就不是事儿,但对于DDoS也会是问题
3、低消耗
可以在7*24小时不间断服务的前提下,进行Nginx版本的平滑升级,Nginx配置文件的平滑修改。即在不停机的情况下升级Nginx,修改替换Nginx配置文件。
4、高可用
Nginx之所以可以实现高并发,是因为其具有很多工作进程worker。当这些工作进程中的某些出现问题停止工作时,并不会影响整个系统的整体运行。因为其它worker会接替那些出问题的线程
5、高扩展
Nginx只所以现在的用户很多,是因为很多功能都已经开发好并模块化。若需要哪些功能,只需要安装相应功能的扩展模块即可。根据编写扩展模块所使用的语言的不同,可以划分为两类:C语言扩展模块与LUA脚本扩展模块。 http://openresty.org/cn/
二、Nginx主要应用
- http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
- 虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
- 反向代理、负载均衡、动静分离 当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
三、Nginx安装
1.window安装
下载地址:http://nginx.org/en/download.html
解压zip文件 双击nginx.exe即可运行
访问:localhost
2.Linux安装
如果安装过nginx 卸载如下
然后使用find / -name nginx*
/etc/yum.repos.d/nginx.repo /etc/nginx /var/lib/yum/repos/x86_64/7/nginx /var/cache/nginx /var/cache/yum/x86_64/7/nginx /var/log/nginx
使用rm -rf file 复制上面的路径以此删除即可
1、添加源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2、通过yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。
sudo yum install -y nginx
查看安装位置
find /|grep nginx.conf
nginx和其模块的工作方式是由配置文件决定的。默认的配置文件名是nginx.conf。默认的放置路径在 /usr/local/nginx/conf, /etc/nginx (CentOS), 或者 /usr/local/etc/nginx (MAC OS). 根据你的系统而有所不同。
3、启动Nginx并设置开机自动运行
sudo systemctl start nginx.service sudo systemctl enable nginx.service
4、浏览查看效果
在浏览器中输入您的服务器地址:http://www.dearcloud.cn/
第二种方式:资源包形式安装
首先安装需要的依赖环境
yum install gcc-c++ yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel
下载nginx, 地址http://nginx.org/en/download.html
下载.tar.gz文件并上传到Linux服务器上
或者直接在Linux上使用wegt命令下载
wget http://nginx.org/download/nginx-1.18.0.tar.gz
解压:
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0/ ./configure #使用默认配置检查 make #编译 make install #安装 /usr/local/nginx/sbin/nginx -v #测试成功
启动
/usr/local/nginx/sbin/ ./nginx
常用命令
Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx 进程本身进行控制的。 Nginx 的参数包括有如下几个:
使用:
/usr/local/nginx/sbin/nginx -参数
- -c:使用指定的配置文件而不是conf目录下的nginx.conf 。
- -t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误。
- -s:reload 重载
- -s:stop 停止
四、nginx配置文件
#第一部分:主要设置影响nginx整体运行的配置指令,比如worker_processes 1; worker_processes值越大 可以支持并发的处理量也越多 user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; #第二部分: events主要影响nginx服务器和用户的网路连接 worker_connections 1024;每个worker_processes支持最大的来连接 events { worker_connections 1024; } #第三部分: 配置最频繁的部分 代理 缓存 日至定义 以及绝大数哦功能和第三方功能模块配置都在这里,包括1.http全局快和server部分块 #1.http块指令包括文件引入 mime-type定义 日志自定义 连接超时时间 单链接请求上限次数 http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; #2.server和虚拟主机有密切关系 每个http包含多个server 而每个server相当于一个虚拟主机 而每个server可以包含多个location server { listen 80;#端口 server_name localhost;#主机名称 #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } #备注:上面的server部分也可以引入外部配置文件 #include /etc/nginx/conf.d/*.conf; }
nginx同时使用(http)80和(https)443端口
server { listen 443 ssl; #监听https 443时需加ssl server_name ; #你的域名 ssl on; ssl_certificate ; #证书路径 ssl_certificate_key ; #证书路径 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; include /etc/nginx/default.d/*.conf; location / { proxy_pass http://127.0.0.1:8080; #代理地址 } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } server { listen 80; server_name ; #你的域名 include /etc/nginx/default.d/*.conf; location / { proxy_pass http://127.0.0.1:8081; #代理地址 } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
其他相关配置
#配置日志目录 mkdir -p /home/hanhuibing/workspace/data/nginx/logs #创建nginx用户 groupadd nginx useradd -g nginx -s /sbin/nologin -M nginx #-g:指定所属的group #-s:指定shell,因为它不需要登录,所以用/sbin/nologin #-M:不创建home目录,因为它不需要登录 vi /conf/nginx.conf #指定nginx用户和组 user nginx nginx; #错误日志存放目录 error_log /home/hanhuibing/workspace/data/nginx/logs/nginx-error.log; /usr/local/nginx/logs/error.log #指定pid的路径 pid logs/nginx.pid; #日志格式(取消注释即可) log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #指定访问日志的路径和格式 access_log /home/hanhuibing/workspace/data/nginx/logs/access.log main
五、nginx实现虚拟机
1.不用nginx如何让一台服务器绑定多个ip地址()
方法一:
使用标准的网络配置工具(比如ifconfig和route命令)添加lP别名:
当前ip配置情况:
在eth0网卡再绑定一个ip:192.168.101.103
/sbin/ifconfig eth0:1 192.168.101.103 broadcast 192.168.101.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.101.103 dev eth0:1
方法二:
将/etc/sysconfig/network-scripts/ifcfg-eth0文件复制一份,命名为ifcfg-eth0:1
修改其中内容:
DEVICE=eth0:1
IPADDR=192.168.25.103
其他项不用修改,重启系统
如何给Ubuntu网站绑定多个IP,怎么给Ubuntu服务器设置多IP? Ubuntu其实只需要设置一个文件 /etc/network/interfaces 即可。
iface lo inet loopback
auto ens33
iface ens33 inet static
address 10.0.143.116
netmask 255.255.255.0
gateway 10.0.143.1
auto ens33:0
iface ens33:0 inet static
address 10.0.143.202
netmask 255.255.255.0
多个不同IP段的 /etc/network/interfaces 配置文件的范例如下:
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 8.8.8.2
netmask 255.255.255.248
gateway 8.8.8.1 要注意这里,多个不同IP段,只要1个gateway配置即可,其他IP不需要配置gateway
auto eth0:0
iface eth0:0 inet static
address 8.8.8.3
netmask 255.255.255.248
auto eth0:1
iface eth0:1 inet static
address 8.8.8.4
netmask 255.255.255.248
配置文件完成后,重启
第二种方式是动态修改.
这里直接使用 ifconfig 命令
sudo ifconfig eth0:0 110.25.*.* broadcast 110.25.*.255 netmask 255.255.255.0
注:
第一种方式在你修改重启之后不会失效.这种方式稍微操作不当,则会造成远程无法连接。
第二种方式虽然只对当前生效,重启之后就会失效.但是不会因为操作不当给自己造成的不便。
修改成功之后用ifconfig命令看一下
eth0
eth0:0 (多出一个eth0:0,查看与eth0的网关是否一样)
2.nginx基于ip的虚拟主机配置
server { listen 80; server_name 192.168.25.141; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-141; index index.html index.htm; } } server { listen 80; server_name 192.168.25.100; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-100; index index.html index.htm; } }
3.nginx基于端口的虚拟主机
server { listen 81; server_name 192.168.25.141; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-81; index index.html index.htm; } } server { listen 82; server_name 192.168.25.141; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-82; index index.html index.htm; } }
4.nginx基于域名的虚拟主机
最有用的虚拟主机配置方式。一个域名只能绑定一个ip地址,一个ip地址可以被多个域名绑定。
server { listen 80; server_name www.demo.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-www; index index.html index.htm; } } server { listen 80; server_name ok.demo.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-hehe; index index.html index.htm; } }
六、nginx三大应用
反向代理和正向代理概述
正向代理:代理客户端,服务器不知道具体谁请求的,比如使用代理服务器访问国外网站,国外网站不知道正真的请求方
反向代理:代理服务端,客户端不知道具体哪一台服务器提供的服务
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
如何使用nginx实现反向代理?
准备工作:在liunx上安装一个tomcat 使用默认端口,使用nginx作为反向代理,当访问www.1234.com时候返回tomcat页面,
配置:在nginx的配置文件中配置代理的地址即可
负载均衡
通过增加服务器将单个服务器处理的负载分发到多个服务器处理即为负载均衡
1)如何使用nginx实现负责均衡?
案例效果:浏览器输入地址www.192.168.3.217/demo/a.html 平均到8080和8081端口
准备:linux安装两台tomcat, 一台8080 一台8081,分别在两台的tomcat里面的webapps目录中创建名称是demo的文件夹,在demo中创建a.html用于测试,两个a.html页面内容可以不一样 方便查看负责均衡效果
nginx配置文件中进行负责均衡配置
通过浏览器访问www.192.168.3.217/demo/a.html 刷新可以看到交替显示不同的页面
2)nginx分配策略
a.轮询(默认):每个请求按时间顺序分配到不同的服务器,如果服务器down掉 自动剔除
b.weight:weight代表权重 默认为1 权重越高 被分配的客户端越多,具体配置如下
c.ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定一个后端服务器,可以解决session的问题
d:fair(第三方),按后端服务器的响应时间来分配请求,响应时间短的优先分配
动静分离
使用nginx把静态资源和动态资源分离,使用tomcat处理动态资源,使用nginx处理静态静态资源。提高请求效率
如何实现?
准备工作:在Liunx的"/"目录下创建两个目录/source/image和/source/js,在image中放置一张图片a.png ,js文件夹中放置一个b.js文件,
效果:通过nginx请求到上面的a.png和测试.js
配置文件中配置
测试:
访问地址:192.168.3.217/image/
//由于配置了autoindex on (展示列表)
访问地址:192.168.3.217/image/a.png
响应一张图片
访问地址:192.168.3.217/js/a.js
响应js文件
七、nginx高可用集群配置
问题:
解决方法:通过配置nginx主从配置解决,如下如图
步骤:
1.两台服务器192.168.3.217和192.168.3.216
2.上面两台服务器分别安装nginx
3.上面两台服务器分别安装keepalived用于主副nginx通信
yum install keepalived -y
安装之后在etc的keepalived下有个keepalived.conf配置文件用于配置nginx高可用
4.完成高可用配置
对于nginx的高可用配置主要是修改keepalived.conf配置文件,至于nginx配置不做修改,
主服务器(192.168.3.217)上的keepalived.conf配置文件如下
#全局配置: global_defs { notification_email { 123456@qq.com #接收报警的邮箱,可以用多个。 654321@qq.com } notification_email_from keepalived@localhost smtp_server 192.168.3.217 #本机转发email(smtp.server地址) smtp_connect_timeout 30 #连接snmp超时时间 router_id LVS_MASTER #运行Keepalived服务器的一个标识。发邮件时显示在邮件标题中的信息,在/etc/host文件中配置 127.0.0.1 LVS_MASTER } vrrp_script chk_http_port{ script "/user/local/src/nginx_check.sh" #检测nginx是否宕机的脚本 interval 2 #检测脚本执行的间隔 weight 2 #当脚本成立 即主服务器宕机之后 将权重降到2 } #VRRP实例虚拟服务器部分: vrrp_instance VI_1 { state MASTER #状态级别,主为MASTER 副为BACKUP interface ens33 网卡 virtual_router_id 50 #主 备机的virtual_router_id相同 priority 100 #优先级 主机值较大 备份机较小 advert_int 1 #主从通告间隔秒数 authentication { auth_type PASS #密钥 auth_pass 1111 } virtual_ipaddress { 192.168.3.215 #虚拟ip地址 } }
服服务器(192.168.3.216)上的keepalived.conf配置文件如下
#全局配置: global_defs { notification_email { 123456@qq.com 654321@qq.com } notification_email_from keepalived@localhost smtp_server 192.168.3.216 smtp_connect_timeout 30 router_id LVS_MASTER } vrrp_script chk_http_port{ script "/user/local/src/nginx_check.sh" interval 2 weight 2 } #VRRP实例虚拟服务器部分: vrrp_instance VI_1 { state BACKUP #状态级别,主为master 副为backup interface ens33 virtual_router_id 50 priority 90 #优先级 主机值较大 备份机较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.215 } }
这里放上我的脚本文件nginx_check.sh
#!/bin/bash A=`ps -C nginx -no-header | wc -l` if [ $A -eq 0 ] then /etc/nginx start sleep 3 if [`ps -C nginx --no-header | wc -1` -eq 0];then killall keepalived fi fi
5.分别启动两台服务器上的nginx和keepalived(systemctl start keepalived.service)
6.测试:浏览器通过虚拟ip访问192.168.3.215 可以看到nginx页面,然后停掉主服务器192.168.3.217上的nginx和keepalived(systemctl stop keepalived.service),然后浏览器访问192.168.3.215,还是可以看到nginx页面
说明配置完成