首页 > 系统相关 >nginx基础篇之虚拟主机实战

nginx基础篇之虚拟主机实战

时间:2024-04-07 23:23:31浏览次数:28  
标签:实战 log 虚拟主机 nginx 88 conf test root

基于nginx部署网站

虚拟主机指的就是一个独立的站点,具有独立的域名,有完整的www服务,例如网站、FTP、邮件等。

Nginx支持多虚拟主机,在一台机器上可以运行完全独立的多个站点。

一、为什么配置虚拟主机

一些草根流量站长,常会搭建个人站点进行资源分享交流,并且可能有多个不同业务的站点,如果每台服务器只运行一个网站,那么将造成资源浪费,成本浪费。

利用虚拟主机的功能,就不用为了运行一个网站而单独配置一个Nginx服务器,或是单独再运行一组Nginx进程。

虚拟主机可以在一台服务器,同一个Nginx进程上运行多个网站。

nginx.conf主配置文件中,最简单的一段虚拟主机配置如下

1.单虚拟主机(静态资源网站)

nginx.conf

原配置文件
[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

降低操作权限
[root@test-88 ~]#id www
uid=666(www) gid=666(www) groups=666(www)
[root@test-88 ~]#vim /etc/nginx/nginx.conf 
[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@test-88 ~]#

huoying.conf

创建虚拟主机子配置文件

把数据放在/www/huoying/index.html
vim /etc/nginx/conf.d/huoying.conf
server{
listen 80;
# nginx 会匹配http://huoying.linux.cc:80
server_name huoying.linux.cc;
charset utf-8;

location / {
  # 根据root参数,填写网页根目录信息
  # 表示访问http://huoying.linux.cc:80自动来这个目录下来找数据
  root /www/huoying/;
  #默认找/www/huoying/ 的名字叫做index.html的文件
  index index.html;
}
}

[root@test-88 ~]#vim /etc/nginx/conf.d/huoying.conf
[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;

location / {
  root /www/huoying/;
  index index.html;
}
}
[root@test-88 ~]#


# 创建网页静态文件,index.html鸣人.jpg
# 部署一个静态网站,最基本的提供,html,jpg,txt等静态数据
# nginx都可以返回,解析请求


[root@test-88 ~]#mkdir -p /www/huoying
[root@test-88 ~]#ls /www
huoying


[root@test-88 ~]#cat > /www/huoying/index.html << EOF
> <meta charset=utf-8>
> 我是火影页面
> EOF
[root@test-88 ~]#cat /www/huoying/index.html 
<meta charset=utf-8>
我是火影页面
[root@test-88 ~]#


[root@test-88 ~]#cd /www/huoying
[root@test-88 /www/huoying]#wget -O 鸣人.jpg https://up.deskcity.org/pic_source/c5/8b/4f/c58b4fef1632c6dfa686815adc581c8a.jpg
[root@test-88 /www/huoying]#ls
index.html  鸣人.jpg

echo '佐助打不过鸣人' > 鸣人与佐助的秘密.txt

测试nginx配置文件语法,然后启动

[root@test-88 /www/huoying]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@test-88 /www/huoying]#systemctl restart nginx

根据域名访问虚拟主机

文件在C:\Windows\System32\drivers\etc下
10.0.0.88 huoying.linux.cc

如果有故障

先排查配置文件
静态文件的权限
[root@test-88 /www/huoying]#chown -R www.www /www/
查看域名与配置的是否一致

如果文件类型是其他异常类型,nginx默认不解析,直接下载

nginx识别的文件类型都在这个文件定义好了

[root@test-88 /www/huoying]#cat /etc/nginx/mime.types 

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

2.基于IP多虚拟主机

Linux操作系统都能够支持给网卡绑定多个IP地址,可以使得一块网卡上运行多个基于IP的虚拟主机。

添加IP

查看ip
[root@test-88 /]#ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.88  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe8e:3483  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:8e:34:83  txqueuelen 1000  (Ethernet)
        RX packets 4202  bytes 2765894 (2.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3268  bytes 1494289 (1.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

添加ip
[root@test-88 /]#ip addr add 10.0.0.89/24 dev eth0
[root@test-88 ~]#ping 10.0.0.89
PING 10.0.0.89 (10.0.0.89) 56(84) bytes of data.
64 bytes from 10.0.0.89: icmp_seq=1 ttl=64 time=0.014 ms
64 bytes from 10.0.0.89: icmp_seq=2 ttl=64 time=0.020 ms


修改conf.d下配置文件,支持多虚拟主机,编写多个server{}标签即可。

[root@test-88 ~]#vim /etc/nginx/conf.d/pord_89.conf
[root@test-88 ~]#cat /etc/nginx/conf.d/pord_89.conf 
server{
  listen 10.0.0.89:80;
  server_name localhost;
  charset utf-8;
  location / {
	root /www/port_89;
	index index.html;
}
}
[root@test-88 ~]#

创建测试数据

[root@test-88 ~]#mkdir -p /www/port_89/
[root@test-88 ~]#echo '这是89端口' > /www/port_89/89.txt
[root@test-88 ~]#chown -R www.www /www/
[root@test-88 ~]#ll /www
total 0
drwxr-xr-x 2 www www 78 Mar 31 15:54 huoying
drwxr-xr-x 2 www www 20 Apr  1 10:11 port_89

重启nginx,访问测试

[root@test-88 ~]#systemctl reload nginx

报错查询

目标文件夹下index.html文件没有
[root@test-88 ~]#mv /www/port_89/89.txt /www/port_89/index.html
修正后可正常展示

3.基于域名的多虚拟主机

基于多IP的虚拟主机可能会造成IP地址不足的问题,如果没有特殊需求,更常用的是基于多域名的形式。

只需要你单独配置DNS服务器,将主机名对应到正确的IP地址,修改Nginx配置,可以识别到不同的主机即可,这样就可以使得多个虚拟主机用同一个IP,解决了IP不足的隐患。

修改conf.d下的配置文件

server{
listen 80;
server_name lol.linux.cc;
charset utf-8;

location / {
  root /www/lol/;
  index index.html;
}
}

server{
listen 80;
server_name dnf.linux.cc;
charset utf-8;

location / {
  root /www/dnf/;
  index index.html;
}
}

创建测试数据

[root@test-88 ~]#mkdir -p /www/lol
[root@test-88 ~]#mkdir -p /www/dnf
[root@test-88 ~]#echo '这是lol' > /www/lol/index.html 
[root@test-88 ~]#echo '这是dnf' > /www/lol/index.html
[root@test-88 ~]#chown -R www.www /www/


解析域名

10.0.0.88 huoying.linux.cc lol.linux.cc dnf.linux.cc

重启nginx,访问测试

systemctl restart nginx

4.基于多端口的虚拟主机

基于端口的配置在生产环境比较少见,用于特殊场景,例如公司内部测试平台网站,使用特殊端口的后台,OA系统、网站后台,CRM后台等。

案例:运行基于80、81端口的虚拟主机运行

修改conf.d下配置文件

[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;

location / {
  root /www/huoying/;
  index index.html;
}
}
[root@test-88 ~]#vim /etc/nginx/conf.d/huoying.conf 
[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;

location / {
  root /www/huoying/;
  index index.html;
}
}

server{
listen 81;
server_name _;
charset utf-8;

location / {
  root /www/haizeiwang/;
  index index.html;
}
}
[root@test-88 ~]#

创建测试数据

[root@test-88 ~]#mkdir -p /www/haizeiwang
[root@test-88 ~]#echo '这是81端口' > /www/haizeiwang/index.html 
[root@test-88 ~]#chown -R www.www /www/

重启nginx,访问测试

[root@test-88 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@test-88 ~]#systemctl restart nginx


[root@test-88 ~]#netstat -tunlp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3231nginx: master  
tcp        0      0 0.0.0.0:81              0.0.0.0:*               LISTEN      3231nginx: master  
[root@test-88 ~]#

5.虚拟主机配置文件优化(include)

如果所有配置都写入一个文件,维护起来很麻烦,修改错了某一个conf文件,导致所有页面都报错,因此拆分为单个的文件更为合适。

二、创建nginx访问日志

日志对于程序员很重要,可用于问题排错,记录程序运行状态,一个好的日志能够给与精确的问题定位。

Nginx日志功能需要在nginx.conf中打开相关指令log_format,设置日志格式,以及设置日志的存储位置access_log,指定日志的格式,路径,缓存大小。

1.日志格式字段解释

nginx.conf中有关访客日志定义如下
 #a
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;

参数解释 
$remote_addr :记录访问网站的客户端IP地址
$remote_user :记录远程客户端用户名称
$time_local :记录访问时间与时区
$request :记录用户的 http 请求起始行信息(请求方法,http协议)
$status :记录 http 状态码,即请求返回的状态,例如 200 、404 、502 等
$body_bytes_sent :记录服务器发送给客户端的响应 body 字节数
$http_referer :记录此次请求是从哪个链接访问过来的,可以根据 referer 进行防盗链设置
$http_user_agent :记录客户端访问信息,如浏览器、手机客户端等
$http_x_forwarded_for :当前端有代理服务器时,设置 Web 节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的 x_forwarded_for 设置

备注
$remote_addr 可能拿到的是反向代理IP地址
$http_x_forwarded_for 可以获取客户端真实IP地址

2.开启关闭日志功能

主配置文件nginx.conf

[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@test-88 ~]#

主配置文件日志access_log  /var/log/nginx/access.log

查看虚拟主机配置文件,除了default.conf默认文件,其他并未使用日志功能
[root@test-88 /etc/nginx/conf.d]#grep 'access_log' ./*.conf
./default.conf:    #access_log  /var/log/nginx/host.access.log  main;

主配置文件日志格式信息

[root@test-88 /etc/nginx/conf.d]#tail -f /var/log/nginx/access.log

关闭日志功能

access_log  off;

3.多虚拟主机的日志

由于企业会有多个网站业务,日志也必然需要分开记录。

单独写入到各自的server{}标签内即可。

⚠️开启access_log日志的参数,可以写在server{}区域内,但是日志格式化的参数,只能写在http{}区域中

1.全局配置

全局定义好日志格式,子页面配置中定义日志路径即可。

更改配置测试

原全局配置
[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@test-88 ~]#

现全局配置
[root@test-88 ~]#vim /etc/nginx/nginx.conf 
[root@test-88 ~]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
[root@test-88 ~]#


原虚拟主机文件配置
[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;

location / {
  root /www/huoying/;
  index index.html;
}
}

server{
listen 81;
server_name _;
charset utf-8;

location / {
  root /www/haizeiwang/;
  index index.html;
}
}
[root@test-88 ~]#


现虚拟主机配置文件
[root@test-88 ~]#cat /etc/nginx/conf.d/huoying.conf 
log_format  main1  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
server{
listen 80;
server_name huoying.linux.cc;
charset utf-8;
access_log  /var/log/nginx/huoying_80_access.log  main1;

location / {
  root /www/huoying/;
  index index.html;
}
}

server{
listen 81;
server_name _;
charset utf-8;
access_log  /var/log/nginx/huoying_81_access.log  main1;

location / {
  root /www/haizeiwang/;
  index index.html;
}
}
[root@test-88 ~]#


测试log日志

[root@test-88 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@test-88 ~]#systemctl reload nginx

三、错误日志

Nginx能够将自身运行故障的信息也写入到指定的日志文件中。对于错误信息的调试,是维护Nginx的重要手段,指令是error_log,可以放在http{}全局中,也可以单独为虚拟主机记录。

关于该参数的官网文档,以及具体的用法

https://nginx.org/en/docs/ngx_core_module.html#error_log

和access_log用法一样

Syntax:	error_log file [level];
Default:	
error_log logs/error.log error;
Context:	main, http, mail, stream, server, location
语法:
error_log file  level;

日志级别在乎debug|info|notice|warn|error|crit|alert|emerg
级别越高,日志记录越少,生产常用模式是warn|error|crit级别
日志的记录,会给服务器增加额外大量的IO消耗,按需修改
crit表示nginx已经出现严重错误以及崩溃,才记录日志,记录日志太少

测试语法

[root@test-88 ~]#vim /etc/nginx/conf.d/pord_89.conf 
[root@test-88 ~]#cat /etc/nginx/conf.d/pord_89.conf 
log_format main2 '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
server{
  listen 10.0.0.89:80;
  server_name localhost;
  charset utf-8;
  access_log /var/log/nginx/port_89.log main2;
  error_log /var/log/nginx/port_89_error.log error;

  location / {
	root /www/port_89;
	index index.html;
}
}
[root@test-88 ~]#
[root@test-88 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

自动生成配置文件模板

https://www.digitalocean.com/community/tools/nginx?domains.0.php.wordPressRules=true&domains.0.logging.acces

四、404页面优化

nginx指令error_page的作用是当发生错误的时候能够显示一个预定义的uri;

语法1
error_page 404 /404.html;

语法2
error_page 404 https://error.taobao.com/app/tbhome/common/error.html;
错误页面优化,nginx,默认访问出错后,会返回不同的错误页面
40X系列的页面
	404 not found 服务器上找不到资源
	403 Forbidden 一般都是权限不足

标签:实战,log,虚拟主机,nginx,88,conf,test,root
From: https://www.cnblogs.com/yechangyao/p/18120154

相关文章

  • nginx高级篇之日志切割
    一、日志切割(shell脚本)nginx日志默认是不切割的,网站运行久了自然生成大量日志,导致单文件的处理,太麻烦,因此工作里一般定期切割,一般按天切割。切割理念1.给nginx进程发送信号,让nginx生成一个新的日志文件,这就是一个日志切割2.手动切割,修改日志准备好旧的日志文件,测试写入大......
  • Nginx离线配置ssl证书
    纯离线的内网环境中使用nginx配置ssl并使用https访问网站。对于服务器中nginx及其它环境的搭建,可参考我的该文章LinuxCentos7离线部署SpringBoot前后端分离项目同时,该文章涉及的部分安装包已提供在以上文章的开头部分。检查环境进入nginx的安装目录(一般是/usr/lo......
  • nginx日志切割之logrotate
    配置详解logrotate是基于crond服务(定时任务)来运行的,有几个重要的配置:1、/etc/logrotate.conf(主配置)和/etc/logrotate.d/*(子配置)/etc/logrotate.conf是全局配置,logrotate.conf里面包含include/etc/logrotate.d这句,加载子配置文件的意思,说明/etc/logrotate.d/目录下是具体的配......
  • linux自动化运维之ansible实战
    ansible基础介绍优点-相比于saltatack和puppet,没有客户端,更轻量级-只是一个工具,可以很容易实现分布式拓展-更强的远程执行命令特点-模块化-支持自定义模块,可以用任何语言编写模块-基于python语言实现-部署简单,基于python和ssh,agentless,无需代理-安全安装......
  • Nginx 文件名逻辑漏洞(CVE-2013-4547)复现
    漏洞原理影响范围:Nginx0.8.41~1.4.3影响范围:Nginx1.5.0~1.5.7Nginx在解析php文件的时候通常在配置文件中如下配置location~\.php${roothtml;includefastcgi_params;fastcgi_passphp:9000;......
  • 鸿蒙HarmonyOS实战-ArkUI组件(TextInput/TextArea)
    ......
  • Nginx 解析漏洞复现
    该漏洞与php和nginx版本无关,是配置错误导致的问题漏洞描述通常在nginx.conf的配置文件或者include包含的其他配置文件下有以下信息location~\.php${fastcgi_indexindex.php;includefastcgi_params;fastcgi_paramR......
  • C语言游戏实战(11):贪吃蛇大作战(多人对战)
         成果展示:贪吃蛇(多人对战) 前言:这款贪吃蛇大作战是一款多人游戏,玩家需要控制一条蛇在地图上移动,吞噬其他蛇或者食物来增大自己的蛇身长度和宽度。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。在开始编写代码之前,我们需要先......
  • 一次SQL注入实战记录
    一、在Google浏览器用inurl搜索语法寻找目标inrul:productInfo.php?id=二、随便点开几个连接,目标出现了给id参数加单引号',页面不正常了,在上方还出现了查询报错的相关信息,相关信息还给出了数据库是MySQL。三、使用sqlmap进行扫描经过小小的等待,有收获了,爆出了数据库名。......
  • 内网nginx代理高德问题
    A为外网服务器B为内网服务器nginx配置server{listen8081;server_name15.72.185.21; location/webapi/{proxy_passhttp://15.72.191.145:18090/; } location/restapi{ proxy_passhttp://15.72.191.145:18090/restapi/;......