学习内容:学习Nginx(Day69)
1、hosts文件修改主机域名
2、安装Nginx
3、nginx的应用场景
1、hosts文件修改主机域名
(1)现在:http://localhost:8080/AppInfoSystem需要通过http://www.huzige.com:8080/AppInfoSystem访问。
Linux下的hosts文件所在路径: /etc/hosts
Win下的host: C:\Windows\System32\drivers\etc
#My host
127.0.0.1 www.huzige.com
127.0.0.1 xx.huzige.com
如果不想要访问路径中的端口号,可以将项目中的端口号改为80。
2、安装Nginx
(1)Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
Web服务器分2类:
1.web服务器:Apache 服务器、Nginx、IIS 微软件提供的服务器
2.web应用服务器:tomcat、resin、jetty
区分:web服务器不能解析jsp等页面,只能处理js、css、html等静态资源。
并发:web服务器的并发能力远高于web应用服务器。
(2)windows安装:下载nginx-1.xx.x.zip解压得到:–注意路径中不要包含中文。双击nginx.exe启动。
三个命令:(在 CMD 中执行)
启动:start nginx.exe
停止:nginx.exe -s stop
重新加载:nginx.exe -s reload
出现2个进程nginx才算是真正的启动成功,杀死进程命令:taskkill /f /t /im nginx.exe
(3)Linux安装
1.gcc 安装:安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:yum install gcc-c++
2.PCRE pcre-devel 安装:PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:yum install -y pcre pcre-devel
3.zlib 安装:zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。yum install -y zlib zlib-devel
4.OpenSSL 安装:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。yum install -y openssl openssl-devel
5.下载Nginx安装包
官网下载,直接下载.tar.gz安装包,地址:https://nginx.org/en/download.html
或者使用wget命令下载(推荐)。确保系统已经安装了wget,如果没有安装,执行 yum install wget
安装。wget -c https://nginx.org/download/nginx-1.18.0.tar.gz
。
下载好后上传到服务器的/usr/local目录下,解压tar -zxvf nginx-1.18.0.tar.gz
进入目录cd nginx-1.18.0
,使用默认配置./configure
,编译安装make & make install
进入目录cd /usr/local/nginx/sbin/
,
启动./nginx
停止./nginx -s stop
退出./nginx -s quit
重新加载./nginx -s reload
(4)Nginx的配置文件
Nginx的核心配置都在/usr/local/nginx/nginx.conf中
#user root root; #配置用户或者组,默认为nobody nobody。
worker_processes 2; #允许生成的进程数,默认为1
#error_log
logs/error.log;
#error_log
logs/error.log notice;
#error_log
logs/error.log info;
#pid logs/nginx.pid; #指定nginx进程运行文件存放地址
events {
worker_connections 1024;
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#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 logs/access.log main; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,可以在http块,server块,location块
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块
#gzip on;
server {
listen 80; #监听端口
server_name localhost; #监听地址
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #/代表所有请求
root html; #根目录
index index.html index.htm; #设置默认页
#deny 127.0.0.1; #拒绝的ip
}
#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 html;
}
}
}
(5)Location语法
1.=
严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
2.~
区分大小写匹配(可用正则表达式)
3.~*
不区分大小写匹配(可用正则表达式)
4.!~
区分大小写不匹配
5.!~*
不区分大小写不匹配
6.^~
如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式
nginx.conf文件中添加server块.
server {
listen 88;
server_name localhost;
#/表示所有请求都过滤,优先级最低
location / {
#root html;
#index index.html index.htm;
echo "hello nginx";
}
#=表示精确匹配,优先级最高
location = /a {
echo "/a";
}
#^~代表以xxx开始,第二优先
location ^~ /a {
echo "^~ /a";
}
#~代表正则匹配,第三优先
location ~ /[0-9] {
echo "~ /[0-9]";
}
}
为了方便展示,在虚拟机上安装echo模块:https://github.com/openresty/echo-nginx-module/tags
上传到nginx同目录下并解压:tar -zxvf echo-nginx-module-0.62.tar.gz
先停止nginx服务,然后cd nginx-1.18.0/
执行:./configure --add-module=/usr/local/echo-nginx-module-0.62
编译:make
复制:cp objs/nginx ../nginx/sbin/
,再次启动即可
安装curl:yum install curl
测试:curl http://localhost:88
输出:hello nginx
curl http://localhost:88/a
输出:/a
curl http://localhost:88/abc
输出:^~ /a
curl http://localhost:88/1
输出:~ /[0-9]
3、nginx的应用场景
(1)静态服务器
静态资源是指非服务器运行动态生成的文件,主要包括浏览器端渲染(html、css、js)、图片(jpeg、gif、png)、视频文件(flv、mpeg)、其他文件(TXT等任意下载文件)。
这些静态资源可以保存在 /usr/local/nginx/static 路径下,当项目打成jar包后放到虚拟机内运行时,可以从外部获取静态资源。
修改nginx.conf文件
server {
listen 80; #监听端口
server_name localhost; #监听地址
location / { #/代表所有请求
proxy_pass http://127.0.0.1:8082; #代理,项目端口号为8082
}
#用正则表达式,当请求的后缀为这些时会找到根目录的static目录下
location ~ .*\.(jpg|jpeg|png|js|css|html|txt) {
root static;
}
error_page 500 502 503 504 /50x.html; #错误页
location = /50x.html {
root html;
}
}
重新启动nginx服务器,使用命令java -jar test.jar
运行项目,项目启动后从 /usr/local/nginx/static 路径获取静态文件,在宿主机使用虚拟机地址就可以访问项目。
(2)虚拟主机
虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,每一个虚拟主机都可以有独立的域名和独立的目录。配置的时候和静态资源服务器配置方法一致,只需要多添加一个server节点,保证访问的url不一样就可以了。
首先配置主机名,起两个别名,方便查看。
127.0.0.1 www.hr.com www.hzg.com
修改nginx.conf文件
server{
listen 81;
server_name www.hr.com;#监听地址分别为主机名的两个别名
location / {
root html2;#请求到的页面是自己重新创建的默认页面
index index.html;
}
}
server{
listen 81;
server_name www.hzg.com;
location / {
root html3;
index index.html;
}
}
在 /usr/local/nginx/ 目录下创建两个不同的html目录和默认页面,并重新启动nginx服务器。
cp -r html/ html2
cp -r html/ html3
在宿主机上使用不同的主机地址访问nginx服务器,以达到访问多台服务器的效果。
服务器地址分别为www.hr.com:81,www.hzg.81
(3)反向代理
使用代理服务器的好处有:
1.提高访问速度。由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门网站能明显提高访问速度。
2.防火墙作用。由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可以在代理服务器上设限,过滤掉某些不安全信息。同时正向代理中上网者可以隐藏自己的IP,免受攻击。
3.突破访问限制。互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,可以直接访问外网。
正向代理(forward proxy):一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并制定目标(原始服务器),然后代理向原始服务器转发请求并将获得的内容返回给客户端,客户端才能使用正向代理。我们平时说的代理就是指正向代理。
反向代理(Reverse Proxy):用户→nginx→tomcat,以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求的客户端,此时代理服务器对外表现为一个反向代理服务器。
server{
listen 80;
server_name www.hzg.com;
location /{
#tomcat服务器
proxy_pass
http://127.0.0.1:8080;
}
}
(4)负载均衡
扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。
1.一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的。
2.一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略。
nginx的负载均衡是通过它的反向代理能力实现的。
upstream tomcatserver {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2; #权重越大使用率越高
}
server{
listen 80;
server_name www.hzg.com;
location /{
proxy_pass http://tomcatserver;
}
}
这样,当访问本地的80端口的时候,会采用轮询的方法跳转到8080端口和8081端口,其中8081端口的权重为8080端口的两倍,就是8081被访问两次,8080会被访问一次。
nginx支持的负载均衡调度算法方式:
weight轮询(默认)。接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
least_conn。最少连接,将新请求分发给不太繁忙的服务器,避免服务器过载。
ip_hash。每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
fair。智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
url_hash。按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包