1 具体内容
中文官网:
http://www.nginx.cn/doc/
https://www.nginx.cn/
英文官网:
http://nginx.org/en/
1.1 nginx简介
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3/SMAP)代理服务器 。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡服务器。在性能上,Nginx占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率;在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。
1.2 正向代理和反向代理
1.2.1正向代理
正向代理类似一个跳板机,代理访问外部资源。
作用:
(1)访问原来无法访问的资源
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
1.2.2反向代理
反向代理的感觉是,客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
作用:
1,保证内网的安全,可以使用反向代理提供WAF(web application firewall)功能,阻止web攻击
2,负载均衡,通过反向代理服务器来优化网站的负载
1.3 web服务器搭建
1.3.1单机版nginx规划
2个服务器(反向代理服务器和web服务器)
web服务器:qy142-webserver1 192.168.xxx.11
反向代理服务器: qy142-nginx1 192.168.xxx.21
1.3.2web后台服务器搭建:
克隆电脑(克隆后的所有操作都在虚拟机里面完成,重启后再使用ssh工具去连接)
centos7:
1,修改网卡配置文件,修改ipaddr
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改第15行
2,修改主机名称
vim /etc/hostname //改名
3,重启系统:reboot
4,使用xshell连接
centos6:
1,修改了三个地方,删除了uuid 和 hwaddr 修改了ipaddr
vim /etc/sysconfig/network-scripts/ifcfg-eth0
2,修改主机名称
vim /etc/sysconfig/network
3,删除mac地址和网卡对应文件
rm -rf /etc/udev/rules.d/70-persistent-net.rules
4,修改主机和ip地址对应文件
vim /etc/hosts
192.168.52.20 nginx1
查看防火墙状态: service firewalld status
关闭防火墙: service firewalld stop;
开机自动关闭: systemctl disable firewalld
验证是否装有jdk,是否配置有JAVA_HOME:
java -version
echo $JAVA_HOME
配置 tomcat 启动运行web项目
复制apache-tomcat-9.0.52.tar.gz到虚拟机下 /root/software
解压:
tar -xzvf /root/software/apache-tomcat-9.0.52.tar.gz -C /usr/
进入目录:
cd /usr/apache-tomcat-9.0.52/
启动tomcat:
./bin/startup.sh
另外链接一个窗口:
cd /usr/apache-tomcat-9.0.52/
查看日志:
tail -F logs/catalina.out
为了更方便的启动和关闭tomcat配置环境变量:
在tomcat目录下执行pwd:
/usr/apache-tomcat-9.0.52
vim /etc/profile
export TOMCAT_HOME=/usr/apache-tomcat-9.0.52
export JAVA_HOME=/usr/java/jdk1.8.0_151
export TOMCAT_HOME=/usr/apache-tomcat-9.0.52
export ClASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$TOMCAT_HOME/bin
echo $TOMCAT_HOME
让配置生效:
source /etc/profile
显示结果:
echo $TOMCAT_HOME
在任意目录下都可以启动关闭tomcat
startup.sh
shutdown.sh
查看tomcat是否在运行:
ps -ef|grep tomcat|grep -v grep
查看端口号是否被占用:
netstat -ano|grep 8080
测试(确保里面防火墙关闭的):
http://192.168.170.31:8080/
准备web后台项目,并打war包,上传war包到:
/usr/apache-tomcat-9.0.52/webapps/
再次测试:
http://192.168.170.31:8080/ssm_restful_demo_20211210/deptRest/queryById?deptNo=70
http://192.168.170.31:8080/ssm_restful_demo_20211210/deptRest/queryAll?pageNo=1&pageSize=10
1.4 部署安装nginx
1.4.1,克隆服务器nginx1
修改IP地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改主机名称
vim /etc/hostname //改名
修改子安全系统
vim /etc/sysconfig/selinux
1.4.2,安装前的准备
1)确保进行了安装了linux常用必备支持库。
(windows vs编译写好的c和c++,在linux下用g++和gcc编译c)
检查是否安装了g++、gcc。
rpm -qa | grep gcc
之后需要出现3个包如下图所示。如果没有出现。需要安装g++、gcc。
检查是否安装gcc-c++
rpm -qa|grep gcc --有的已经安装但版本低,检查时仍然出错
如果有就不需要安装
yum install -y gcc-c++
2)准备和安装 pcre-8.38.tar.gz。
该文件为正则表达式库。让nginx支持rewrite需要安装这个库(rewrite :和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。)。
( PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。 nginx通过ngx_http_rewrite_module模块支持url重写)
pcre: http://www.pcre.org/
pcre安装:
解压pcre-8.12.tar.gz
tar -xzvf /root/software/pcre-8.44.tar.gz -C /usr 解压
进入解压后的目录
cd /usr/pcre-8.44/
配置
./configure(./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC)
编译
make(是用来编译的,它从Makefile中读取指令,然后编译。)
安装
make install(用来安装的,它也从Makefile中读取指令,安装到指定的位置。)
检查是否安装
pcre-config --version
3)安装gzip模块需要 zlib 库
yum install -y zlib-devel
1.4.3,nginx安装
tar -xzvf /root/software/nginx-1.18.0.tar.gz -C /usr/
进入目录
cd /usr/nginx-1.18.0/
配置
./configure
编译
#make
安装
# make install
查看是否安装成功
ls /usr/local/nginx/
进入安装目录
cd /usr/local/nginx/
启动:(进入上面红圈安装的目录,在sbin中,有nginx的启动文件)
./sbin/nginx
(如果报错 error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory,用如下方法查看缺少)
ldd $(which /usr/local/nginx/sbin/nginx)
ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。
通过列表可以看出,在/lib64下缺少libpcre.so.1我们到这里面去建立软连接
ln -s libpcre.so.0.0.1 libpcre.so.1
测试:(在浏览器访问当前nginx服务器)
http://192.168.170.21/
分析为什么可以访问地址:
vim conf/nginx.conf http->server->(listen 80 location root index)
修改监听端口号:
:36 listen 8088
重启服务:
/usr/local/nginx/sbin/nginx -s reload
再次访问:
http://192.168.170.21:8088/
1.4.4,反向代理配置
让我们可以通过nginx访问webserver1上的tomcat
vim /usr/local/nginx/conf/nginx.conf
在43 3yy->p
在46下面加入(注意要自己IP):
location /qy141/ {
proxy_pass http://192.168.170.31:8080/;
}
然后再回去启动nginx
查看nginx进程是否启动:
ps -ef|grep nginx |grep -v grep
存在进程,重启nginx :
/usr/local/nginx/sbin/nginx -s reload
不存在进程,直接启动nginx:
/usr/local/nginx/sbin/nginx
测试:
http://192.168.170.21:8088/
http://192.168.170.21:8088/qy141/ssm_restful_demo_20211210/deptRest/queryById?deptNo=70
http://192.168.170.21:8088/qy141//ssm_restful_demo_20211210/deptRest/queryAll?pageNo=1&pageSize=10
1.5 配置文件详解:
1.5.1结构:
全局设置
全局设置包含Events和HTTP
HTTP包含upstream和多个Server
Server又包含多个location
1.5.2 重要配置解释:
main(全局设置,设置的指令将影响其他所有设置)
server(主机设置,用于指定主机和端口)
upstream(负载均衡服务器设置,设置一系列的后端服务器)
location(URL匹配特定位置的设置,用于匹配网页位置)。
详细配置:
全局配置 :
user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nonody账号运行。
worker_processes是个主模块指令,指定了Nginx要开启的进程数。每个Nginx进程平均耗费10M~12M内存 ,支持5W并发。建议指定和CPU的数量一致即可。
error_log是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、 crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
pid是个主模块指令,用来指定进程pid的存储文件位置。
worker_rlimit_nofile用于绑定worker进程和CPU, Linux内核2.4以上可用
events:
事件指令是设定Nginx的工作模式及连接数上限
HTTP 服务器配置:
include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法。
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式
log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。
client_max_body_size用来设置允许客户端请求的最大的单个文件字节数;
client_header_buffer_size用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K;
large_client_header_buffers用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K;
sendfile 参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞;
keepalive_timeout 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接;
client_header_timeout设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误;
client_body_timeout设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60;
send_timeout指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
在安装目录的conf下nginx.conf配置(加入红字部分)
server虚拟主机配置:
server标志定义虚拟主机开始
listen 用于指定虚拟主机的服务端口
server_name 用来指定IP地址或者域名,多个域名之间用空格分开
index 用于设定访问的默认首页地址
root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
Charset用于 设置网页的默认编码格式。
access_log用来指定此虚拟主机的访问日志存放路径
main用于指定访问日志的输出格式。
location URL匹配配置
URL地址匹配是进行Nginx配置中最灵活的部分。 location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /root/baidu;
expires 30d;
}
通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天。
这段设置是将upload和html下的所有文件都交给nginx来处理,当然,upload和html目录包含在/root/baidu/test目录中。
location ~ ^/(upload|html)/ {
root /root/baidu/test;
expires 30d;
}
location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。
location ~ .*.jsp$ {
index index.html;
proxy_pass http://localhost:8080;
}
upstream myapp{ #定义负载均衡设备的Ip及设备状态
ip_hash;
server 192.168.23.30:8080; down;
server 192.168.23.31:8080; weight=2;
server 192.168.23.32:8080;
server 192.168.23.33:8080; backup;
}
完整配置:
# 全局配置
user nginx; # Nginx运行的用户
worker_processes auto; # Nginx工作进程数,auto表示根据CPU核心数自动配置
error_log /var/log/nginx/error.log; # 错误日志路径
pid /var/run/nginx.pid; # 进程ID文件路径
# 事件模块配置
events {
worker_connections 1024; # 每个工作进程可以同时处理的连接数
}
# HTTP模块配置
http {
include /etc/nginx/mime.types; # MIME类型配置文件
default_type application/octet-stream; # 默认的MIME类型
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; # 开启sendfile功能
tcp_nopush on; # 开启tcp_nopush功能
tcp_nodelay on; # 开启tcp_nodelay功能
keepalive_timeout 65; # 单个连接的超时时间
client_max_body_size 100m; # 客户端请求的最大大小
include /etc/nginx/conf.d/*.conf; # 加载额外的配置文件
server {
listen 80; # 监听的端口号
server_name example.com; # 服务器名
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html; # 默认首页文件
}
error_page 404 /404.html; # 404错误页面配置
error_page 500 502 503 504 /50x.html; # 50x错误页面配置
location = /50x.html {
root /usr/share/nginx/html; # 50x错误页面的路径
}
}
}
1.6 负载均衡:
1.6.1 概念:
为了保证服务的高可用,服务单元往往都是集群化部署的,当服务消费者消费服务时,负载均衡组件(nginx)获取服务提供者所有实例的注册信息,并通过一定的负载均衡策略(可以自己配置)选择一个服务提供者实例,向该实例进行服务消费,这样就实现了负载均衡。
在Nginx配置文件中,upstream用于定义后端服务器池,通常用于负载均衡和反向代理。下面是一个示例的upstream配置及其注释:
http {
# ...
upstream backend {
server backend1.example.com weight=5; # 后端服务器1的地址和权重
server backend2.example.com; # 后端服务器2的地址,默认权重为1
server unix:/tmp/backend3.sock; # 使用Unix域套接字连接到后端服务器3
}
server {
listen 80;
location / {
proxy_pass http://backend; # 反向代理到后端服务器池
}
}
# ...
}
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
server:指定后端服务器的地址。可以是主机名、IP地址或Unix域套接字。如果使用Unix域套接字连接到后端服务器,需要在地址前添加unix:前缀。
weight:指定每个后端服务器的权重。默认值为1。权重越高的服务器将获得更多的请求。
max_fails:指定在标记后端服务器为不可用之前,允许的最大失败次数。默认值为1。如果一个后端服务器在一定时间内连续失败了指定次数,就会被标记为不可用。
fail_timeout:指定标记后端服务器为不可用的时间。默认值为10秒。如果一个后端服务器被标记为不可用,它将不会被分配新的请求,直到fail_timeout时间过去。
backup:指定一个后端服务器作为备份服务器。当所有其他服务器都不可用时,备份服务器会接收请求。备份服务器不会参与正常的负载均衡。可以在server参数后添加backup关键字来指定一个服务器作为备份服务器。
down:指定一个后端服务器当前不可用,并且不应该分配新的请求。可以在server参数后添加down关键字来标记一个服务器为不可用。
max_conns:指定一个服务器的最大并发连接数。超过这个数目的请求将不会被分配到该服务器。可以在server参数后添加max_conns=N来指定一个服务器的最大并发连接数为N。
slow_start:指定一个服务器在启动时逐渐增加其权重,以避免在一开始就接收大量请求而导致系统负载过高。可以在server参数后添加slow_start=seconds来指定服务器的慢启动时间。