Nginx 基础使用、配置文件详解、Keepalived高可用

Nginx 基础使用

安装

# 解压nginx压缩包,压缩包自行下载
tar zxvf nginx-1.21.6.tar.gz
# 进入解压后目录
cd nginx-1.21.6
# 安装依赖
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
# 编译安装到/usr/local/nginx
./configure --prefix=/usr/local/nginx
make
make install

启动Nginx

进入安装好的目录 /usr/local/nginx/sbin
./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 重新加载配置

关于防火墙

关闭防火墙

systemctl stop firewalld.service

禁止防火墙开机启动

systemctl disable firewalld.service

放行端口

firewall-cmd --zone=public --add-port=80/tcp --permanent

重启防火墙

firewall-cmd --reload

安装成系统服务

创建服务脚本

vi /usr/lib/systemd/system/nginx.service

服务脚本内容

[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重新加载系统服务

systemctl daemon-reload

启动服务

systemctl start nginx

开机启动

systemctl enable nginx.service

目录结构

进入Nginx的主目录我们可以看到这些文件夹

client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp

其中这几个文件夹在刚安装后是没有的,主要用来存放运行过程中的临时文件

client_body_temp fastcgi_temp proxy_temp scgi_temp

conf

用来存放配置文件相关

html

用来存放静态文件的默认目录 html、css等

sbin

nginx的主程序

基本运行原理

Nginx 基础使用、配置文件详解、Keepalived高可用_第1张图片

Nginx配置与应用场景

最小配置

worker_processes

worker_processes 1; 默认为1,表示开启一个业务进程

worker_connections

worker_connections 1024; 单个业务进程可接受连接数

include mime.types;

include mime.types; 引入http mime类型

default_type application/octet-stream;

default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。

sendfile on;

sendfile on; 使用linux的sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。

未开启sendfile:
Nginx 基础使用、配置文件详解、Keepalived高可用_第2张图片

开启后

Nginx 基础使用、配置文件详解、Keepalived高可用_第3张图片

keepalive_timeout 65;

server

Nginx 基础使用、配置文件详解、Keepalived高可用_第4张图片

虚拟主机配置

server {
    listen 80; 监听端口号
    server_name localhost; 主机名
	location / { 匹配路径
		root html; 文件根目录
		index index.html index.htm; 默认页名称
	}
	error_page 500 502 503 504 /50x.html; 报错编码对应页面
	location = /50x.html {
		root html;
	}
}

虚拟主机

原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务

servername匹配规则

我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。

完整匹配

我们可以在同一servername中匹配多个域名

server_name vod.mmban.com www1.mmban.com;

通配符匹配

server_name *.mmban.com

通配符结束匹配

server_name vod.*;

正则匹配

server_name ~^[0-9]+\.mmban\.com$;

反向代理

location / {
	proxy_pass http://baidu.com/;
}

基于反向代理的负载均衡

upstream httpd {
	server 192.168.44.102:80;
	server 192.168.43.103:80;
}

负载均衡策略
轮询
默认情况下使用轮询方式,逐一转发,这种方式适用于无状态请求。

weight(权重)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream httpd {
	server 127.0.0.1:8050 weight=10 down;
	server 127.0.0.1:8060 weight=1;
	server 127.0.0.1:8060 weight=1 backup;
}

down:表示当前的server暂时不参与负载
weight:默认为1.weight越大,负载的权重就越大。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

ip_hash

根据客户端的ip地址转发同一台服务器,可以保持回话。

least_conn

最少连接访问

url_hash

根据用户访问的url定向转发请求

fair

根据后端服务器响应时间转发请求

动静分离

配置反向代理

location / {
	proxy_pass http://127.0.0.1:8080;
	root html;
	index index.html index.htm;
}

增加每一个location

location /css {
	root /usr/local/nginx/static;
	index index.html index.htm;
}
location /images {
	root /usr/local/nginx/static;
	index index.html index.htm;
}
location /js {
	root /usr/local/nginx/static;
	index index.html index.htm;
}

使用一个location
使用正则

location 前缀

/ 通用匹配,任何请求都会匹配到。
= 精准匹配,不是以指定模式开头
~ 正则匹配,区分大小写
~* 正则匹配,不区分大小写
^~ 非正则匹配,匹配以指定模式开头的location

location匹配顺序

多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
所有类型location存在时,“=”匹配 > “^~”匹配 > 正则匹配 > 普通(最大前缀匹配)

location ~*/(css|img|js) {
	root /usr/local/nginx/static;
	index index.html index.htm;
}

alias与root

location /css {
	alias /usr/local/nginx/static/css;
	index index.html index.htm;
}

root用来设置根目录,而alias在接受请求的时候在路径上不会加上location。

1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的; 2)root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
3)使用alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/“符
号!!
4)alias虚拟目录配置中,location匹配的path目录如果后面不带”/“,那么访问的url地址中这个path目录后面加不加”/“不影响访问,访问时它会自动加上”/“; 但是如果location匹配的path目录后面加上”/“,那么访问的url地址中这个path目录必须要加上”/“,访问时它不会自动加上”/“。如果不加上”/“,访问就会失败!
5)root目录配置中,location匹配的path目录后面带不带”/",都不会影响访问。

UrlRewrite

rewrite语法格式及参数语法:

Nginx 基础使用、配置文件详解、Keepalived高可用_第5张图片
Nginx 基础使用、配置文件详解、Keepalived高可用_第6张图片
实例

rewrite   ^/([0-9]+).html$    /index.jsp?pageNum=$1    break;

同时使用负载均衡
应用服务器防火墙配置
开启防火墙

systemctl start firewalld

重启防火墙

systemctl restart firewalld

重载规则

firewall-cmd --reload

查看已配置规则

firewall-cmd --list-all

指定端口和ip访问

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.44.101" port protocol="tcp" port="8080" accept"

移除规则

firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.44.101" port port="8080" protocol="tcp" accept"

网关配置

upstream httpds {
	server 192.168.44.102 weight=8 down;
	server 192.168.44.103:8080 weight=2;
	server 192.168.44.104:8080 weight=1 backup;
}
location / {
	rewrite ^/([0-9]+).html$   /index.jsp?pageNum=$1   redirect;
	proxy_pass http://httpds ;
}

防盗链配置

valid_referers none | blocked | server_names | strings ;

  • none, 检测 Referer 头域不存在的情况。
  • blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以“http://” 或 “https://” 开头。
  • server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。

在需要防盗链的location中配置

valid_referers 192.168.44.101;
if ($invalid_referer) {
	return 403;
}

使用curl测试

curl -I http://192.168.44.101/img/logo.png

带引用

curl -e "http://baidu.com" -I http://192.168.44.101/img/logo.png

高可用配置

安装Keepalived

Keepalived可以虚拟出一个ip,多台主机都配置Keepalived,当前主机挂了可以选举出另一台接管这个ip。这样只需要一个ip就可以连接主备机,无需关注主备切换。

如需关闭防火墙(不建议):

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

用yum的方式安装

yum install keepalived

配置主主机

使用yum安装后配置文件在

/etc/keepalived/keepalived.conf

配置文件内容很多,全部删掉替换成下面的,看注释做对应修改

! Configuration File for keepalived
global_defs {
   # 给当前主机起个名字
   router_id NGINX1
}
# vrrp是Keepalived在内网中通讯的协议,VI_1是实例名称,可改
vrrp_instance VI_1 {
   state MASTER
   # ens33是本机网卡名称,可以ip addr查看
   interface ens33
   virtual_router_id 51
   # 主备竞选时的优先级 数字越大越高
   priority 100
   # 间隔检测时间
   advert_int 1
   # 同一组的认证配置,防止同一个内网中多个Keepalived组错乱
   authentication {
      auth_type PASS
      auth_pass 1111
   }
   # 虚拟ip地址,用户访问下面的ip,会映射到本机,可配多个
   virtual_ipaddress {
      192.168.25.211
   }
}

启动Keepalived

systemctl start keepalived

查看当前ip

[root@nginx1 ~]# ip addr
1: lo: ,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:24:8c:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.25.125/24 brd 192.168.25.255 scope global noprefixroute dynamic ens33
       valid_lft 5358sec preferred_lft 5358sec
       
# 多了这个192.168.25.211的vip

    inet 192.168.25.211/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::575:23df:be65:edbf/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

配置副主机

操作同主主机,配置文件与主主机不同的地方:

  • router_id 改名字
  • state BACKUP
  • priority 50

启动Keepalived

测试主主机宕机后,ip能否漂移

关机

init 0

关闭主主机依然能ping通即可。

ping 192.168.25.211

副主机ip addr发现192.168.25.211已经跑到副主机上。

Keepalived安装完成!
Keepalived只会检测自己的进程,假设主机没宕机,nginx宕机了,Keepalived是不会漂移ip的。此时可以写一个sh脚本,一直在服务器上跑,查看nginx状态,如果发现nginx挂了,则干掉Keepalived的进程。其他redis集群,mysql集群等,都是同理。

你可能感兴趣的:(nginx)