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官方文档

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值