一、Nginx简介
Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·西索夫)所开发,供俄国大型的入口网站及搜索引擎Rambler(漫步者)(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、 腾讯等。
1. 优点:
- 占用内存少,并发能力强
- Nginx专为性能优化而开发, 在高并发的情况下,能够支持高达 50,000 个并发连接数的响应.
- Nginx支持热部署, 可以在不间断服务的情况下,对软件版本进行升级.
2. 应用场景:
- http服务器: Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
- 虚拟主机: 可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
- 反向代理,负载均衡 : 当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
二、Nginx安装
1、 官网下载nginx
下载源码压缩包
2、准备安装环境
1. 安装gcc环境
yum install gcc-c++
2. 安装PCRE
yum install -y pcre pcre-devel
nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库
3. 安装zlib
yum install -y zlib zlib-devel
nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
4. 安装OpenSSL
yum install -y openssl openssl-devel
OpenSSL 是一个强大的安全套接字层密码库,nginx不仅支持http协议,还支持https,所以需要在linux安装openssl库。
3、安装Nginx
1. 解压Nginx
tar -xvf nginx-1.17.8.tar
2. 生成Makefile文件
进入解压后的文件夹,执行 configure 命令
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
3. 创建零时文件目录
mkdir /var/temp/nginx/client -p
4. 编译
make
5. 安装
make install
三、Nginx基本使用
进入 prefix=/usr/local/nginx 指定的安装目录,其中有三个文件夹:
html目录:存放静态资源,当nginx被用作静态资源服务器时,要将html的资源放在这里,然后就可以被访问到了。
conf目录:存放各种配置文件,
sbin目录:存放可执行文件
# 1、启动 Nginx ,进入sbin目录,执行:
./nginx
# 2、查看是否启动成功 【有两个Nginx进程就对了】
ps aux | grep nginx
# 3、关闭
./nginx -s stop
# 4、重新加载配置文件
./nginx -s reload
四、Nginx配置
4.1 配置多个虚拟主机
Nginx的虚拟主机类似于Tomcat 的web应用,Nginx可以配置多个虚拟主机,Tomcat通过应用名区分不同的应用,Nginx通过端口号和域名来决定访问的是哪个虚拟主机。
在conf目录下有一个nginx.conf配置文件:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.mochen2.com;
location / {
root html2;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.mochen.com;
location / {
root html;
index index.html index.htm;
}
}
}
在http中可以配置多个server,一个server就代表一个虚拟主机,
listen指定该虚拟主机对应的端口号。
server_name则指定虚拟主机对应的域名。
当有请求时,首先根据请求的端口号判断访问哪个虚拟主机,若找到多个对应的虚拟主机,再根据域名进行判断。
server_name可以设置:
- 多个域名并用空格分开。
- 以 \* 通配符开头的域名
- 以 \* 通配符结尾的域名
- 正则表达式
匹配顺序也是如上所示,首先用完整域名进行匹配,若无法匹配成功,则与 以 \* 开头的匹配,以此类推,匹配到一个就不再进行匹配。
location
location用于匹配请求的资源路径【也就是域名后边的URI】,如这里的 / 就表示匹配所有路径,后边大括号里的root用于指定资源的根目录,这里的html【默认值】是相对路径,指的是安装目录下的html文件夹。也可以使用绝对路径将此虚拟主机的更目录指向服务器的任意位置【当然也要nginx有权限访问】,如下例:
location /kk {
root /test/html;
index index.html index.htm;
}
这里的 /kk 表示此虚拟主机可以匹配 如:www.mochen.com/kk/xx.html 之类的请求,请求访问的资源就是 /test/html/kk/xx.html。
index类似于Tomcat中的welcome-file-list用于指定欢迎页,一般是相对路径,如这里代表访问www.mochen.com/kk时默认访问 /test/html/kk/index.html 文件。
location之后可以更多种路径匹配符,/ 表示匹配一切请求,同样优先级也是最低的。
4.2 反向代理
1、何为反向代理
代理很好理解,就是代替某人做某些事情。那反向又是什么意思呢?反向与正向相对,因为反向代理与正向代理正好相反,就是一个名称而已。
正向代理:由代理服务器代理客户端访问互联网资源。如VPN就是正向代理。反向代理:由代理服务器代理服务器,向客户端提供服务。
Nginx就可以充当着个反向代理服务器,由它接受请求并按一定的规则转发到后台服务器。
2、配置反向代理服务器
upstream ssm{
server 127.0.0.1:8082;
}
server {
listen 80;
server_name www.mochen.com;
location /ssm-web {
proxy_pass http://ssm;
}
location / {
root html;
index edu-boss/index.html;
}
}
在location中通过proxy_pass进行请求转发设置。
在upstream中通过server指定被代理服务器访问地址。
3、负载均衡
当系统面临大量用户访问,负载过高的时候,通常会使用增加服务器数量来进行横向扩展, 负载均衡主要是为了分担访问量,将请求合理分发给不同的服务器, 避免临时的网络堵塞。
负载均衡策略:
*轮询:*默认策略, 每个请求按照时间顺序逐一分配到不同的服务器,如果某一个服务器下线,能自动剔除。
配置方式:【无需配置】
upstream lagouServer{
# 用server定义 HTTP地址
server 192.168.52.100:8081;
server 192.168.52.100:8082;
}
*weight:*可以根据服务器的实际情况调整服务器权重。权重越高分配的请求越多,权重越低,请求越少。默认是都是1.
#负载均衡
upstream lagouServer{
# 用server定义 HTTP地址
server 192.168.52.100:8081 weight=1;
server 192.168.52.100:8082 weight=10;
}
*ip_hash:*保证每个访客固定访问一个后端服务器,
#负载均衡
upstream lagouServer{
ip_hash;
# 用server定义 HTTP地址
server 192.168.52.100:8081 weight=1;
server 192.168.52.100:8082 weight=10;
}
*least_conn:*把请求转发给连接数较少的后端服务器
maven多环境配置
在不同的环境中部署就要手动修改为对应环境的配置,这样太麻烦了以及这样也会很容易出错。 多环境配置就是通过maven的相关配置来在打包时指定各个环境对应配置文件。
1、为开发环境和生产环境各写一个配置文件,在主配置文件需要的地方引入。
2、在pom文件中进行配置
<profiles>
<profile>
<id>dev</id>
<properties>
<!-- 测试环境 -->
<env>development</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<!-- 正式环境 -->
<env>product</env>
</properties>
</profile>
</profiles>
<build>
<finalName>web</finalName>
<filters>
<filter>src/main/resources/filter/${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>filter/*.properties</exclude>
</excludes>
<filtering>true</filtering>
</resource>
</resources>
</build>
profile的id定义环境标识,在编译时通过指定该标识表名使用什么环境进行编译。
在properties中指定环境变量env【代表各环境配置文件名】,在下方的filter中使用该变量选用对应环境的配置文件。
activation配置默认使用哪个环境。
build中的resource用于配置打包时的资源,默认就是src/main/resources下的全部文件,excludes表示那些东西不需要出现在最终的jar或war包中。
filtering表示这些资源是否需要引入上方filter配置的文件中的数据,也就是,只有设置了true,在jdbc.properties中 \${xxx} 才能生效。
3、使用mvn打包
命令方式:
打本地包 mvn -Pdev install 或者mvn install(因为本例activeByDefault配的为true)
打产品包 mvn -Pprod install
idea中使用MVN: