Nginx虚拟主机配置索引
Nginx虚拟主机配置
1.概念
- 虚拟主机,在web服务中就是一个独立的网站站点,这个站点对应着独立的域名,IP或端口,具有独立的程序和资源,可以独立的对外提供web服务
- 在 Nginx 中,使用一个 server{} 标签来标识一个虚拟主机,Nginx支持多台虚拟主机,可以在一台机器上运行完全独立的多个站点
- 虚拟主机有三种类型:基于域名的虚拟主机、基于端口的虚拟主机、基于 IP 的虚拟主机。
2.Nginx配置文件
nginx的配置文件 nginx.conf
[root@k8s-master03 ~]#cat /etc/nginx/nginx.conf
#定义Nginx运行的用户
user nginx;
#定义Nginx的工作进程数,建议和CPU总核数相同
worker_processes auto;
#Nginx错误日志
error_log /var/log/nginx/error.log;
#Nginx进程号文件
pid /run/nginx.pid;
#Nginx包含文件(可以在引入其它的配置文件,减少篇幅)
include /usr/share/nginx/modules/*.conf;
#事件模型
events {
#单个工作进程最大连接数
worker_connections 1024;
}
#核心功能配置,设定http服务器
http {
#定义日志内容格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#Nginx 访问日志文件
access_log /var/log/nginx/access.log main;
#开启高效文件传输模式
sendfile on;
#激活tcp_nopush参数可以允许把http response header和文件的开始放在一个文件里发布,作用是减少网络报文段的数量
tcp_nopush on;
#激活tcp_nodelay,内核会等待将更多的字节组成一个数据包,从而提高I/O性能
tcp_nodelay on;
#长连接超时时间
keepalive_timeout 65;
#哈希表类型大小
types_hash_max_size 2048;
#包含文件 文件拓展名与文件类型映射表
include /etc/nginx/mime.types;
#默认文件类型
default_type application/octet-stream;
#包含Nginx配置文件
include /etc/nginx/conf.d/*.conf;
#虚拟主机配置
server {
#监听端口
listen 80 default_server;
listen [::]:80 default_server;
#域名
server_name _;
#站点根目录
root /usr/share/nginx/html;
#默认服务器块的加载配置文件
include /etc/nginx/default.d/*.conf;
#对 / 进行反向代理
location / {
}
#错误页面
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
3.基于IP的多虚拟主机
1.给网卡添加ip别名,使一块网卡运行多个基于IP的虚拟主机
[root@k8s-master03 nginx]#ifconfig ens33:1 192.168.236.141 netmask 255.255.255.0 broadcast 192.168.236.255 up
[root@k8s-master03 nginx]#ifconfig ens33:2 192.168.236.142 netmask 255.255.255.0 broadcast 192.168.236.255 up
[root@k8s-master03 nginx]#ifconfig ens33:3 192.168.236.143 netmask 255.255.255.0 broadcast 192.168.236.255 up
2.查看设置好的ip别名
[root@k8s-master03 nginx]#ip a |grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 192.168.236.136/24 brd 192.168.236.255 scope global noprefixroute ens33
inet 192.168.200.18/32 scope global ens33
inet 192.168.236.143/24 brd 192.168.236.255 scope global secondary ens33:3
inet 192.168.236.142/24 brd 192.168.236.255 scope global secondary ens33:2
inet 192.168.236.141/24 brd 192.168.236.255 scope global secondary ens33:1
3.创建一个新的根站点目录
[root@k8s-master03 ~]#cd /usr/share/nginx/html
[root@k8s-master03 html]#mkdir -p www/s{1,2,3}
4.创建三个对应的index文件
[root@k8s-master03 html]#echo "s1.html" >> www/s1/index.html
[root@k8s-master03 html]#echo "s2.html" >> www/s2/index.html
[root@k8s-master03 html]#echo "s3.html" >> www/s3/index.html
4.在nginx的配置文件目录中,创建一个www目录
[root@k8s-master03 html]#cd /etc/nginx/
[root@k8s-master03 nginx]#mkdir www.d
[root@k8s-master03 nginx]#touch www.d/s{1,2,3}.conf
5.修改Nginx配置文件 在http模块中加上include语句
[root@k8s-master03 nginx]#vim nginx.conf
include /etc/nginx/www.d/*.conf;
6.配置www.d下面的配置文件 #对应之前创建的1 2 3
[root@k8s-master03 nginx]#cat www.d/s#.conf
server {
listen 192.168.236.14#:80;
server_name _;
charset utf-8;
location / {
root /usr/share/nginx/html/www/s#;
index index.html;
}
}
7.重新加载nginx
[root@k8s-master03 html]#nginx -s reload
8.检测
[root@k8s-master03 html]#curl 192.168.236.142
s2.html
[root@k8s-master03 html]#curl 192.168.236.143
s3.html
[root@k8s-master03 html]#curl 192.168.236.141
s1.html
4.基于域名的多虚拟主机
基于ip的多虚拟主机的配置,会导致ip不足,因此更常用的是基于域名的多虚拟主机配置。在第3节的基础上,只需要对www.d下面的配置文件进行修改即可测试基于域名的多虚拟主机
1.修改www.d下面的配置文件 #对应之前创建的1 2 3
[root@k8s-master03 html]#vim /etc/nginx/www.d/s1.conf
server {
listen 80;
server_name www.s#.com;
charset utf-8;
location / {
root /usr/share/nginx//html/www/s#;
index index.html;
}
}
2.重载nginx
[root@k8s-master03 html]#nginx -s reload
3.修改host文件(可以选择windows,也可以选择linux,我在这里选择的是另一台linux主机)
[root@mysql ~]#cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.236.136 www.s1.com
192.168.236.136 www.s2.com
192.168.236.136 www.s3.com
4.在该台linux主机上检测
[root@mysql ~]#curl www.s1.com
s1.html
[root@mysql ~]#curl www.s2.com
s2.html
[root@mysql ~]#curl www.s3.com
s3.html
5.基于端口的多虚拟主机
同样,我们可以拿之前的配置文件和站点文件来进行测试
可以通过lsof -i端口号 命令来检查该端口是否被占用
1.修改www.d下面的配置文件 #对应之前创建的1 2 3
[root@k8s-master03 html]#vim /etc/nginx/www.d/s#.conf
server {
listen 8#; #选择没有被占用的任意一个端口
server_name _;
charset utf-8;
location / {
root /usr/share/nginx/html/www/s#;
index index.html;
}
}
2.重载nginx
[root@k8s-master03 html]#nginx -s reload
3.检测(我选择在本机检测)
[root@k8s-master03 html]#curl 127.0.0.1:81
s1.html
[root@k8s-master03 html]#curl 127.0.0.1:82
s2.html
[root@k8s-master03 html]#curl 127.0.0.1:83
s3.html
6.Nginx的访问日志
nginx.conf中对日志格式定义如下
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
其中
$remote_addr:记录访问网站的客户端地址
$remote_user:记录访问网站的客户端用户名称
$time_local:记录访问的时间
$request:记录请求的起始行信息
$status:记录http状态码
$body_bytes_sent:记录服务器返回给客户端的相应字节数
$http_referer:记录请求来源的链接,可以根据该项设置防盗链设置
$http_user_agent:记录客户端访问信息
http_x_forwarded_for:当前端有代理服务器时,设置web节点记住客户端地址
1.查看日志的格式
[root@k8s-master03 html]#tail -n 1 /var/log/nginx/access.log
127.0.0.1 - - [12/Jan/2021:12:12:14 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.61.1" "-"
2.多虚拟主机定义日志
由于定义了多虚拟主机,因此可以将日志功能也进行区分,方便查阅,用access_log定义存储位置 可以放在http{}中,针对所有server()虚拟主机生效,也可以单独写在server{}中,单独记录某一个虚拟主机的日志
还是基于之前的www.d/目录下面的三个配置文件进行修改 #对应之前创建的1 2 3
[root@k8s-master03 s1]#cat /etc/nginx/www.d/s#.conf
server {
listen 8#;
access_log /var/log/nginx/s#_access_log main;
server_name _;
charset utf-8;
location / {
root /usr/share/nginx/html/www/s#;
index index.html;
}
}
3.重载nginx
[root@k8s-master03 s1]#nginx -s reload
4.随机访问一个站点目录,查看对应的访问日志文件
[root@k8s-master03 tmp]#curl 127.0.0.1:81
s1.html
[root@k8s-master03 tmp]#cat /var/log/nginx/s1_access_log
127.0.0.1 - - [12/Jan/2021:15:17:16 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.61.1" "-
7.Nginx的错误日志
启用nginx的错误日志 ,用error_log定义存储位置,同访问日志
error_log语法:error_log <FILE> <LEVEL>;
错误日志级别:
debug | info | notice | warn | error | crit | alert | emerg
级别越高,记录的信息越少
生产场景一般是 warn | error | crit 这三个级别之一
8.Nginx目录浏览功能
通过nginx的目录浏览功能,可以将你电脑中的资料共享出来,方便快速访问
1.修改nginx.conf配置文件 在location{}添加autoindex模块
[root@k8s-master03 ~]#vim /etc/nginx/nginx.conf
location / {
root /usr/share/nginx/html/;
autoindex on;
}
2.将根站点目录下面的默认首页文件重命名(因为浏览器访问时是默认访问index.html文件)
[root@k8s-master03 ~]#mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
3.重载nginx
[root@k8s-master03 ~]#nginx -s reload
4.此时访问网站,便可以发现你站点目录下的资料已经共享出来了
9.Nginx状态信息功能
Nginx有一个重要的模块ngx_http_stub_status_module模块,它通过'状态页面'提供对基本Nginx状态信息的访问
我们可以通过如下命令来检查模块是否启用
[root@k8s-master03 ~]#nginx -V 2>&1 | grep -o with-http_stub_status_module
with-http_stub_status_module
1.编辑nginx.conf文件 在server{}中添加
[root@k8s-master03 ~]#vim /etc/nginx/nginx.conf
#Nginx状态页
location = /nginx_status {
stub_status;
}
2.重载nginx
[root@k8s-master03 ~]#nginx -s reload
3.访问页面
[root@k8s-master03 ~]#curl 127.0.0.1/nginx_status
Active connections: 1
server accepts handled requests
10 10 11
Reading: 0 Writing: 1 Waiting: 0
Active connections:当前活跃的连接数量,包括waiting连接数
server:一共处理的请求数
accepts:接受的客户端连接总数
handled:已处理的连接总数
requests:客户端请求总数
Reading: nginx正在读取请求报头的当前连接数
Writing:nginx正在将响应写回到客户端的当前连接数
Waiting:当前等待请求的空闲客户端连接数
10.Nginx访问认证
有时候我们有些内容需要进行授权才可以查看(需要输入账号密码),而Nginx提供了认证模块ngx_http_auth_basic_module。
1.修改nginx配置文件 加入auth_basic auth_basic_user_file
[root@k8s-master03 ~]#vim /etc/nginx/www.d/s1.conf (也可以修改nginx.conf配置文件)
location / {
root /usr/share/nginx/html/www/s1;
index index.html;
auth_basic "yup"; #账号名
auth_basic_user_file /root/s1_passwd; #密码文件
}
2.创建一个密码文件,可以使用htpasswd密码生成工具,如果没有该命令可以使用yum install httpd-tools -y 命令安装
语法:htpasswd -bc .access username password #在当前目录生成.access文件,用户是username,密码是password
[root@k8s-master03 ~]#htpasswd -bc /root/s1_passwd yup 123456
Adding password for user yup
3.重载nginx
[root@k8s-master03 ~]#nginx -s reload
4.检测 当不使用账号密码时,无法访问到网站内容
[root@k8s-master03 s1]#curl 127.0.0.1:81
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
[root@k8s-master03 s1]#curl 127.0.0.1:81 -u yup:123456
s1.html
深入学习nginx可以去阅读nginx的官方文档
nginx官方文档