Linux服务之nginx中http设置及虚拟主机搭建
目录
一.http相关概述
1.mime
2.server下的listen及root
2.1 listen
2.2 root
3.alias别名
4.location相关概述
4.1 语法规则初步解释
5.access模块
6.验证模块
6.1 htpasswd
7.自定义错误页面
8.虚拟主机搭建 (yum安装)
一.http相关概述
http 是一个大的语句块,包含若干个小的语句块(比如server语句块)。
http {
expires 1d;
include mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录
default_type application/octet-stream; #除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件
#日志配置部分
#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 logs/access.log main;
#自定义优化参数
sendfile on;
#tcp_nopush on; #在开启了sendfile的情况下,合并请求后统一发送给客户端。
#tcp_nodelay off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。
#keepalive_timeout 0;
keepalive_timeout 65 65; #设置会话保持时间,第二个值为响应首部:keepAlived:timeout=65,可以和第一个值不同
#gzip on; #开启文件压缩
server {
listen 80; #设置监听地址和端口
server_name localhost ; #设置server name,可以以空格隔开写多个并支持正则表达式,如:*.kgc.com www.kgc.* ~^www\d+\.kgc\.com$ default_server
1.mime
此项为支持的 文件格式,如果不支持的格式 会自动帮你下载,如果支持 就会显示在网页上
范例:
text/plain
text/html
text/css
image/jpeg jpg jpeg
image/png
video/mp4
application/javascript
2.server下的listen及root
2.1 listen
语法结构:
listen address[:port] [default_server] [ssl] [http2 | quic] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
例子:
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000 bind;
2.2 root
指定主页文件的位置
Syntax: root path;
Default:
root html;
Context: http, server, location,
root 指明根目录的位置
location 根据 用户访问地址的不同, 指定访问的目录
例子: 用户默认访问的主站点文件夹是 /data/nginx/html/pc/
server {
listen 80;
server_name localhost;
root /data/nginx/html/pc/;
}
3.alias别名
例子:别名设置
server {
listen 80;
server_name www.kgc.com;
location /nwes {
root /data/nginx/html/pc/;
#相当于追加 将 文件夹news追加到/data/nginx/html/pc/news
}
location /study{
alias /mnt/nginx/sports/;
#相当于替换 你访问 study 就是访问/mnt/nginx/sports
}
}
4.location相关概述
4.1 语法规则初步解释
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~ #用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写
~ #用于标准url前,表示包含正则表达式,并且区分大小写
~* #用于标准url前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
#\ #用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号
表格归纳
符号 | 作用 |
---|---|
= | 用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求 |
^~ | 用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写 |
~ | 用于标准uri前,表示包含正则表达式,并且区分大小写 |
~* | 用于标准uri前,表示包含正则表达式,并且不区分大写 |
不带符号 | 匹配起始于此uri的所有的uri |
例子:请解答以下题目选择匹配的 location
location ~ /Test1/$ {
return 200 'A位置最前的正则表达式匹配';
}
location ~* /Test1/(\w+)$ {
return 200 'B长正则表达式匹配';
}
location ^~ /Test1/ {
return 200 'C 停止正则表达式匹配';
}
location /Test1/Test2 {
return 200 'D 无符号最长的前缀匹配';
}
location /Test1 {
return 200 'E 无符号短前缀匹配';
}
location = /Test1 {
return 200 'F =精确匹配!';
}
/Test1
/Test1/
/Test1/Test2
/Test1/Test2/
/test1/Test2
详细解释
url 192.168.91.100/Test1
优先遍历 筛选出符合条件的前缀匹配
因为F精确匹配 E无符号短前缀匹配
由于优先级的关系所以
优先匹配F F =精确匹配!
url 192.168.91.100/Test1/
优先遍历 筛选出符合条件的前缀匹配
C 停止正则表达式匹配 ^~ /Test1/
E 无符号短前缀匹配 /Test1
nginx 会优先遍历CE
CE 优先匹配 C 比 E长 所以选C
E 又会停止匹配正则的location 所以A B出局
优先匹配 C 停止正则表达式匹配
url 192.168.91.100/Test1/Test2
优先遍历 筛选出符合条件的前缀匹配
C 停止正则表达式匹配 ^~ /Test1/
D 无符号最长的前缀匹配 /Test1/Test2
E 无符号短前缀匹配 /Test1
此时 D 由于最长胜出 但是 由于没有 ^~ 前缀 所以会继续按配置文件的顺序去找正则匹配
A ~ /Test1/$ 已Test1 结尾显然不符合
B ~* /Test1/(\w+)$ TEST1后面有1个以上 字母或数字或下划线或汉字 符合要求所以选择 B
优先匹配 B长正则表达式匹配
url 192.168.91.100/Test1/Test2/
优先遍历符合条件的前缀匹配
C 停止正则表达式匹配 ^~ /Test1
D 无符号最长的前缀匹配 /Test1/Test2
E 无符号短前缀匹配 /Test1
先记住 D 无符号最长的前缀匹配
然后去匹配正则
A ~ /Test1/$ 已Test1 结尾显然不符合
B ~* /Test1/(\w+)$ TEST1后面有1个以上字符 \w #匹配字母或数字或下划线或汉字 而/ 不在w中不符合要求
所以返回优先使用D 无符号最长的前缀匹配
url 192.168.91.100/test1/Test2
优先遍历符合条件的匹配
无前缀符号
直接去匹配正则
只有 B 不区分大小写的正则可以匹配
B ~* /Test1/(\w+)$ TEST1后面有1个以上字符 \w #匹配字母或数字或下划线或汉字 而/ 不在w中不符合要求
优先匹配B
5.access模块
格式:
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except
Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except (限制 用户的访问方式)
官方例子:
Example Configuration
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
实际例子:
配置文件修改
server {
listen 80;
server_name www.kgc.com;
allow 192.168.91.0/24;
deny 192.168.91.101;
location / {
root /data/nginx/html/pc;
}
}
匹配了之后就不往下匹配了
所以范围小的往上
当访问 有问题时 默认站点 是按 文件的名字首字母开头排序
实际例子:禁止 用户访问 url 192.168.91.100/test
server{
listen 192.168.91.100:80;
server_name www.lucky.com;
root /data/html;
location /test {
deny 192.168.91.101;
}
}
6.验证模块
模块名称:ngx_http_auth_basic_module
语法:
Syntax: auth_basic string | off;
Default:
auth_basic off;
Context: http, server, location, limit_except
Syntax: auth_basic_user_file file;
Default: —
Context: http, server, location, limit_except
配置例子:
配置
server {
listen 80;
server_name www.kgc.com;
location / {
root /data/nginx/html/pc;
}
location /admin{
root /data/;
auth_basic "welcome"; #提示信息
auth_basic_user_file /data/.httpuser; #用户名密码文件,需要用htpasswd 命令生成
}
}
6.1 htpasswd
要实现验证需要用户名和密码,htpasswd 命令可以建立 虚拟用户名和密码,此命令来自于 httpd-tools 包,如果没有安装 一下即可。
使用方法:
第一次生成文件
htpasswd -c 文件路径 姓名 交互式生成密码
htpasswd -bc 文件路径 姓名 密码 直接将密码跟在后面
-c 代表新建用户名和密码对应的文件
-b 将密码跟在用户名后
非第一次
htpasswd 文件路径 姓名 交互式生成密码
htpasswd -b 文件路径 姓名 密码 直接将密码跟在后面
生成用户名密码案例:
第一次
[root@localhost conf.d]#htpasswd -bc /apps/nginx/conf.d/.httpuser kgc 123456
#没有 yum install httpd-tools -b 将名字密码跟在后面 -c 新建文件
Adding password for user kgc
[root@localhost conf.d]#cat /apps/nginx/conf.d/.httpuser
kgc:$apr1$RtjFE23R$lf2n.YpdssSf1EYJbIDqT0
非第一次
[root@localhost error]#htpasswd /apps/nginx/conf.d/.httpuser xiaoming
New password:
Re-type new password:
Adding password for user xiaoming
htpasswd -bc /data/.httpuser kgc 123456
7.自定义错误页面
格式:
Syntax: error_page code ... [=[response]] url;
Default: —
Context: http, server, location, if in location
error_page 404 /index.html
error_page 固定关键字
code 错误响应码(404 403 500 501 502 504等)
= 可以将响应码转换
response code 状态 666
uri 访问连接
例子:自定义错误页面
www.pc.com/xxxxxxxx 404
www.pc.com/40x.html
server {
listen 80;
server_name www.kgc.com;
root /data/nginx/html/pc;
error_page 404 /40x.html;
#当出现404 错误 就去 root /data/nginx/html/pc/error/ 这个文件夹找40x.html 这个文件
location = /40x.html {
root /data/nginx/html/pc/error/;
}
}
[root@localhost nginx]#mkdir /data/nginx/html/pc/error/
#建立目录
[root@localhost nginx]#cd /data/nginx/html/pc/error/
#切换目录
[root@localhost nginx]#vim 40x.html
#新建页面,此处页面名字需要和 配置文件中的一致
例子:自定义错误代码
自定义 错误码
server {
listen 80;
server_name www.kgc.com;
root /data/nginx/html/pc;
error_page 404 =302 /40x.html;
#把错误码 404 指定成302 注意此处的 40x.html 需要真实存在建立的页面必须一致
location = /40x.html {
root /data/nginx/html/pc/error/;
}
location / {
root /data/nginx/html/pc;
}
location /admin{
auth_basic "admin site";
auth_basic_user_file /apps/nginx/conf.d/.httpuser;
}
}
例子:错误了直接跳转到主页面
#出了错 直接跳转到显示主站点
server {
listen 80;
server_name www.kgc.com;
root /data/nginx/html/pc/index.html;
error_page 404 =302 /index.html;
#把错误码 404 指定成302 并跳到主页面:/index.html
error_page 404 = /index.html;
#也可以不更改状态码直接跳转
8.虚拟主机搭建 (yum安装)
1.修改配置文件
[root@localhost ~]#vim /etc/nginx/nginx.conf
#修改配置文件 要放在 http 模块里
include /etc/nginx/mime.types;
include /apps/nginx/conf.d/*.conf;
2.建立子配置文件
[root@localhost ~]#mkdir -p /apps/nginx/conf.d/
#建立子配置文件
3.分别编写子配置文件
基于域名
[root@localhost conf.d]#vim pc.conf
#分别编写配置文件
server {
listen 80;
server_name www.pc.com;
root /data/nginx/html/pc/;
}
[root@localhost conf.d]#vim mobile.conf
#分别编写配置文件
server {
listen 80;
server_name www.mobile.com;
root /data/nginx/html/mobile/;
}
基于端口
[root@localhost conf.d]#vim pc.conf
#分别编写配置文件
server {
listen 192.168.91.100:80;
server_name www.pc.com;
root /data/nginx/html/pc/;
}
[root@localhost conf.d]#vim mobile.conf
#分别编写配置文件
server {
listen 192.168.91.100:8080;
server_name www.mobile.com;
root /data/nginx/html/mobile/;
}
4.构建数据文件夹和相应的数据文件
[root@localhost ~]#mkdir /data/nginx/html/pc -pv
[root@localhost ~]#mkdir /data/nginx/html/mobile -pv
#构建数据文件夹
[root@localhost ~]#echo pc > /data/nginx/html/pc/index.html
[root@localhost ~]#echo moblie > /data/nginx/html/mobile/index.html
#构建数据文件
5.去另一台机器修改/etc/hosts文件
[root@localhost ~]#vim /etc/hosts
192.168.91.100 www.pc.com
192.168.91.100 www.mobile.com
基于域名
[root@localhost ~]#curl www.mobile.com
moblie
[root@localhost ~]#curl www.pc.com
pc
基于端口
[root@localhost ~]#curl 192.168.91.100:8080
moblie
[root@localhost ~]#curl 192.168.91.100:80
pc