# 解压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
进入安装好的目录 /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
用来存放配置文件相关
用来存放静态文件的默认目录 html、css等
nginx的主程序
Nginx配置与应用场景
worker_processes 1; 默认为1,表示开启一个业务进程
worker_connections 1024; 单个业务进程可接受连接数
include mime.types; 引入http mime类型
default_type application/octet-stream; 如果mime类型没匹配上,默认使用二进制流的方式传输。
sendfile on; 使用linux的sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
开启后
虚拟主机配置
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中匹配多个域名
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和访问比率成正比,用于后端服务器性能不均的情况。
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地址转发同一台服务器,可以保持回话。
最少连接访问
根据用户访问的url定向转发请求
根据后端服务器响应时间转发请求
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 ~*/(css|img|js) {
root /usr/local/nginx/static;
index index.html index.htm;
}
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目录后面带不带”/",都不会影响访问。
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 ;
在需要防盗链的location中配置
valid_referers 192.168.44.101;
if ($invalid_referer) {
return 403;
}
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可以虚拟出一个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
操作同主主机,配置文件与主主机不同的地方:
启动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集群等,都是同理。