Nginx 基础使用
![](https://img-blog.csdnimg.cn/img_convert/1df11a8bcd5b48208dc3a160ab3b543f.png)
安装
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
./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的主程序
基本运行原理
![](https://img-blog.csdnimg.cn/img_convert/dc6908dbceb156ec623c221874a49962.png)
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:
![](https://img-blog.csdnimg.cn/img_convert/39ec6dfaa567d224ff3a0d12be65101d.png)
开启后
![](https://img-blog.csdnimg.cn/img_convert/e9884b6247d7edfe5e4f35acfedeba0c.png)
keepalive_timeout 65;
server
![](https://img-blog.csdnimg.cn/img_convert/c3c2d234c37bf034a2af815cf820fa3d.png)
虚拟主机配置
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语法格式及参数语法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/81aaeb0c60e94a18bc52977658876708.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/d0635426573e4af2a2a9905f9f53519f.png)
实例
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_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.211
}
}
启动Keepalived
systemctl start keepalived
查看当前ip
[root@nginx1 ~]
1: lo: <LOOPBACK,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: <BROADCAST,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
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集群等,都是同理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)