Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的并可以商业化,配置使用也比较简单。
概述:一般的访问流程是客户端直接向目标服务器发送请求并获取内容,使用正向代理后,客户端改为向代理服务器发送请求,并指定目标服务器(原始服务器),然后由代理服务器和原始服务器通信,转交请求并获得的内容,再返回给客户端。正向代理隐藏了真实的客户端,为客户端收发请求,使真实客户端对服务器不可见。
概述:反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址。
概述:为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力。
概述:增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将请求分发到不同的服务器,也就是我们所说的负载均衡。
#安装nginx
yum install nginx
#查看安装nginx的版本信息
nginx -v
rpm -ql nginx
/etc/nginx/conf.d/
文件夹,是我们进行子配置的配置项存放处,/etc/nginx/nginx.conf
主配置文件会默认把这个文件夹中所有子配置项都引入/usr/share/nginx/html/
文件夹,通常静态文件都放在这个文件夹systemctl start firewalld # 开启防火墙
systemctl stop firewalld # 关闭防火墙
systemctl status firewalld # 查看防火墙开启状态,显示running则是正在运行
firewall-cmd --reload # 重启防火墙,永久打开端口需要reload一下
# 添加开启端口,--permanent表示永久打开,不加是临时打开重启之后就会失效
firewall-cmd --permanent --zone=public --add-port=8080/tcp
# 查看防火墙,添加的端口也可以看到
firewall-cmd --list-all
#开启nginx
systemctl start nginx
#配置开机启动
systemctl enable nginx
nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen # 重启 Nginx
nginx -s stop # 快速关闭
nginx -s quit # 等待工作进程处理完成后关闭
nginx -T # 查看当前 Nginx 最终的配置
systemctl
是 Linux 系统应用管理工具 systemd
的主命令,用于管理系统systemctl start nginx # 启动 Nginx
systemctl stop nginx # 停止 Nginx
systemctl restart nginx # 重启 Nginx
systemctl reload nginx # 重新加载 Nginx,用于修改配置后
systemctl enable nginx # 设置开机启动 Nginx
systemctl disable nginx # 关闭开机启动 Nginx
systemctl status nginx # 查看 Nginx 运行状态
nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件 nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改。
;
分号结尾,指令与参数间以空格符号分隔;{}
大括号将多条指令组织在一起;include
语句允许组合多个配置文件以提升可维护性;#
符号添加注释,提高可读性;$
符号使用变量;可以将nginx.config的配置文件分为三部分
第一部分: 全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等,如worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。
第二部分:events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等,下面的配置表示每个 work process 支持的最大连接数为 1024。
第三部分:http块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http 全局块、server 块。
http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server块
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
user nginx; # 运行用户,默认即是nginx,可以不进行设置
worker_processes 1; # Nginx 进程数,一般设置为和 CPU 核数一样
error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录
pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
worker_connections 1024; # 每个进程允许最大并发数
}
http { # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
# 设置日志模式
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; # Nginx访问日志存放位置
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
include /etc/nginx/conf.d/*.conf; # 加载子配置项
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
deny 172.168.22.11; # 禁止访问的ip地址,可以为all
allow 172.168.33.44;# 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
error_page 400 404 error.html; # 同上
}
}
反向代理1:
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
location / {
proxy_pass http://127.0.0.1:8001; #配置代理的地址
}
}
#问题1
#使用以下指令查看SELinux配置:
getsebool httpd_can_network_connect
#SELinux配置将httpd网络连接关闭,所以很自然将其启用即可
setsebool -P httpd_can_network_connect 1
#问题2
#Starting nginx: nginx: [emerg] bind() to 0.0.0.0:9001 failed (13: Permission denied)问题
#权限拒绝,经检查发现是开启selinux 导致的, 直接关闭
getenforce #查看当前是否开启 selinux;输出 disabled 或 permissive 为关闭;输出 enforcing 为开启
#临时关闭 selinux
setenforce 0 #设置 SELinux 成为 permissive 模式
setenforce 1 #设置 SELinux 成为 enforcing 模式
#永久关闭 selinux
vim /etc/selinux/config
#将 SELINUX=enforcing 改为 SELINUX=disabled
如上配置,我们监听 80 端口,直接访问服务器ip地址,不加端口号时默认为 80 端口,故访问该服务器时会跳转到 127.0.0.1:8001路径上,即访问tomcat01,这样就实现了简单的反向代理。
反向代理2:
实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中 nginx 监听端口为 9001,
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8001
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8002
server {
listen 9001; # 配置监听的端口
server_name localhost; # 配置的域名
location ~ /edu/ {
proxy_pass http://127.0.0.1:8001; #配置代理的地址
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8002; #配置代理的地址
}
}
location [= | ~ | ~* | ^~] uri{
}
反向代理还有一些其他的指令,可以了解一下:
proxy_set_header
:在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息;proxy_connect_timeout
:配置 Nginx 与后端代理服务器尝试建立连接的超时时间;proxy_read_timeout
:配置 Nginx 向后端服务器组发出 read 请求后,等待相应的超时时间;proxy_send_timeout
:配置 Nginx 向后端服务器组发出 write 请求后,等待相应的超时时间;proxy_redirect
:用于修改后端服务器返回的响应头中的 Location 和 Refresh。http {
upstream myserver{
ip_hash;
server localhost:8001 weight=1;
server localhost:8002 weight=1;
}
server{
listen 9001;
server_name localhost;
location / {
proxy_pass http://myserver;
proxy_connect_timeout 10;
}
}
}
负载均衡策略:
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
权重
weight 代表权,默认为 1,权重越高被分配的客户端越多。指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
upstream myserver{
server localhost:8001 weight=10;
server localhost:8002 weight=10;
}
ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
upstream myserver{
ip_hash;
server localhost:8001 weight=10;
server localhost:8002 weight=10;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{
server localhost:8001;
server localhost:8002;
fair;
}
http {
server{
listen 9001;
server_name localhost;
location /images/ {
root /data/;
autoindex on; #开启自动所有,以文件目录形式展示
}
location /www/ {
root /data/;
ecpires 14d; #缓存天数
index index.html index.htm; #索引为html htm
}
}
}
默认访问url时会在匹配的路径后面添加要访问的路径,如访问ip/images会匹配到/data/images文件目录下