Nginx虚拟主机的搭建的实现步骤


Posted in Servers onJanuary 18, 2022

Nginx服务基础

关于Nginx

一款高性能、轻量级Web服务软件

稳定性高

系统资源消耗低

对HTTP并发连接的处理能力高

单台物理服务器可支持30 000~50000个并发请求

Nginx相对于Apache的优点:

轻星级,同样是web服务,比Apache 占用更少的内存及资源﹔高并发,Nginx处理请求是异步非塞的,而Apache
则是阻塞型的,在高并发下Nginx能保持低资源低消耗高性能;高度模块化的设计

编写模块相对简单;社区活跃,各种高性能模块出品迅速。

Apache相对于Nginx的优点:

rewrite,比Nginx的rewrite强大;模块超多,基本想到的都可以找到;少bug,Nginx的bug相对较多;超稳定

存在就是理由,一般来说,需要性能的web 服务,用Nginx。如果不需要性能只求稳定,那就Apache。Nginx处理动态请求是弱项,一般动态请求要Apache去做,Nginx只适处理静态网页或反向代理。

  • Nginx是一个基于事件的Web服务器,Apache是一个基于流程的服务器;
  • Nginx所有请求都由一个线程处理,Apache单个线程处理单个请求;
  • Nginx避免子进程的概念,Apache是基于子进程的;
  • Nginx在内存消耗和连接方面更好,Apache在内存消耗和连接方面一般;
  • Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于CPU和内存等硬件;
  • Nginx支持热部署,Apache不支持热部署;
  • Nginx对于静态文件处理具有更高效率,Apache相对一般;
  • Nginx在反向代理场景具有明显优势,Apache相对一般。

Nginx访问控制

安装

关闭防火墙

安装依赖包

#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件yum -y install pcre-devel zlib-devel gcc gcc-c++ make#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件
yum -y install pcre-devel zlib-devel gcc gcc-c++ make

Nginx虚拟主机的搭建的实现步骤

创建运行用户、组

创建运行用户、组(Nginx服务程序默认以nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)

useradd -M -s /sbin/nologin nginx

编译安装Nginx

cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/

cd nginx-1.12.0/
./ configure \
--prefix=/usr/local/nginx \     #指定nginx的安装路径
--user=nginx \                  #指定用户名
--group=nginx \                 #指定组名
--with-http_stub_status_module  #启用http_stub_status_module 模块以支持状态统计

make && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统识别nginx的操作命令

Nginx虚拟主机的搭建的实现步骤

启动前先关掉之前装的apache服务

Nginx虚拟主机的搭建的实现步骤

检查、启动、重启、停止 nginx服务

nginx -t   #检查配置文件是否配置正确
nginx      #启动

#停止
cat /usr/local/nginx/logs/nginx.pid #先查看nginx的PID号
kill -3 <PID号> #-3保证数据不丢失
kill -s QUIT <PID号>
killall -3 nginx
killall -s QUIT nginx

#重载
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx

kill -USR1 <PID号> #日志分割,重新打开日志文件
kill -USR2<PID号>  #平滑升级
nginx -v           #查看版本号

新版本升级:
tar -zxvf nginx-1.xx.xx.tar.gz
cd nginx-1.xx.xx
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module

Nginx虚拟主机的搭建的实现步骤

nginx #启动服务
检查端口是否开启

Nginx虚拟主机的搭建的实现步骤

查看进程号

Nginx虚拟主机的搭建的实现步骤

使用kill命令杀死进程号即可停止nginx服务

配置 Nginx服务管理

vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

Nginx虚拟主机的搭建的实现步骤

认识Nginx服务的主配值文件nginx.conf

1.全局块
配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

2.events块:
配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

3.http块:
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

4.server块:
配置虚拟主机的相关参数,一个http中可以有多个server。

5.location块:
配置请求的路由,以及各种页面的处理情况。

vim /usr/local/nginx/conf/nginx.conf

1.全局设置

cat /proc/ cpuinfo l grep -c processor#查看cpu内核数

#user nobody;              #运行用户,若编译时未指定则默认为nobody
worker_processes 1;        #工作进程数量,可配置成服务器内核数*2,如果网站访问量不大,一般设为1就够用了
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid;       #PID文件的位置

2.I/o事件配置

events {
    use epoll;                #使用epoll模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
    worker_connections 4096;  #每个进程处理4096个连接
}
#如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

uname -r #查看内核版本

3.HTTP配置

http {
  ##文件扩展名与文件类型映射表
  include    mime.types;
  ##默认文件类型
  default_typeapplication/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 logs/access.log main;
  ##支持文件发送(下载)
  sendfile     on;
  ##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
  #tcp_nopush  on;
  ##连接保持超时时间,单位是秒
  #keepalive_timeout 0;
  keepalive_timeout 65;
  ##gzip模块设置,设置是否开启gzip压缩输出
  #gzip on;
  
  ##web 服务的监听配置
  server {
    ##监听地址及端口
    listen 80;
    ##站点域名,可以有多个,用空格隔开
    server_name www.jzm.com;
    ##网页的默认字符集
    charset utf-8;
    ##根目录配置
    location / {
        ##网站根目录的位置/usr/local/nginx/html
        root html;
        ##默认首页文件名
        index index.html index.php;
    }
    ##内部错误的反馈页面
    error_page 500 502 503 504/50x.html;
    ##错误页面配置
    location = /50x.html {
        root html;
    }
  }
}

日志格式设定

$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local:用来记录访问时间与时区;
$request:用来记录请求的url与http协议;
$status:用来记录请求状态(成功是200);
$body_bytes_sent:记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。
反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

location常见配置指令,root、alias、proxy_pass
root(根路径配置):root /var/www/html
请求www.jzm.com/test/1.html,会返回文件/var/www/html/test/1.html

访问状态统计配置

1.先使用命令查看已安装的Nginx是否包含HTTP_STUB_STATUS模块

/usr/local/nginx/sbin/nginx -V
cat /opt/nginx-1.12.0/auto/options | grep YES #可查看nginx已安装的所有模块

修改nginx.conf 配置文件,指定访问位置并添加 stub_status 配置

cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak
vim /usr/ local/nginx/ conf/ nginx.conf
......
http {
......
  server {
    listen 80;
    server_name www.jzm.com;
    charset utf-8;
    location / {
      root html;
      index index.html index.php;
    }
    #添加stub_status配置
    location /status {         #访问位置为/status
        stub_status on;        #打开状态统计功能
        access_log off;        #关闭此位置的日志记录
    }
  }
}

重启服务,访问测试

systemctl restart nginx

浏览器访问http://192.168.80.30/status
Active connections:表示当前的活动连接数;
server accepts handled requests:表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、己处理的请求数。可curl -Ls http://192.168.80.20/status 结合awk与if语句进行性能监控。

并发量检测脚本

#!/bin/bash
#设置变量,获取当前活跃的连接数
num=$(curl -Ls http://192.168.80.30/status | awk '/Active connections/ {print $3}')

if [ "$num" -gt 2 ];then
  echo "警告!当前web服务并发量过大!当前并发量为 $num"
fi

基于授权的访问控制

生成用户登录码认证文件

yum install -y httpd-tools
htpasswd -c /usr/local/nginx/userlist zhangsan #第一次一定要加-c
cat /usr/local/nginx/userlist
chown nginx /usr/local/nginx/userlist
chmod 400 /usr/local/nginx/userlist

Nginx虚拟主机的搭建的实现步骤

修改主配置文件相对应目录,添加认证配置项

vim /usr/local/nginx/conf/nginx.conf
......
    server {
        location / {
         ......
           #添加认证配置
           auth_basic "secret";
           #设置登录码提示框文字信息
           auth_basic_user_file /usr/local/nginx/passwd.db;
        }
    }

Nginx虚拟主机的搭建的实现步骤

重启服务,访问测试
登录后复制

nginx -t
systemctl restart nginx

浏览器访问http://192.168.80.20

Nginx虚拟主机的搭建的实现步骤

基于客户端的访问控制

访问控制规则如下

deny IP/IP段:拒绝某个IP或IP段的客户端访问。allow IP/IP 段:允许某个IP或IP段的客户端访问。规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/ local/nginx/conf/nginx.conf
......
server {
location /{
......
##添加控制规则##
allow 192.168.80.200;
#允许访问的客户端IP
deny all;
#拒绝其它IP客户端访问
systemctl restart nginx

基于域名的Nginx虚拟主机

提供域名解析

echo "192.168.80.20 www.pll.com www.benet.com" >> /etc/hosts

为虚拟主机添加测试文件

mkdir -p /var/www/html/benet
mkdir -p /var/www/html/kgc
echo "www.pll.com" > /var/www/html/jzm/index.html
echo "www.benet.com" > /var/www /html/benet/index.html

修改Nginx配置文件

vim /usr/local/nginx/conf/nginx.conf
......
http {
......
    server {
        listen 80;
        server_name  www.jzm.com;
        charset utf-8;
        access_log logs/www.jzm.access.log;
        
        location / {
            root   /var/www/html/jzm;
            index  index.html index.php;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
	}
	
     server {
         listen 80;
         server_name www.benet.com;
         charset utf-8;
         access_log logs/www.benet.access.log;
         
         location / {
              root /var/www/html/benet;
              index index.html index.php;
         }
         
         error_page 500 502 503 504 /50x.html;
               location = 50x.html{
               root html;
               }
           }
      }
      
#检查语法
nginx -t
systemctl restart nginx
#浏览器访问
http://www.jzm.com/
http://www.benet.com/

基于IP的Nginx虚拟主机

ifconfig ens33:0 192.168.80.120 netmask 255.255.255.0

echo "192.168.80.20 www.jzm.com" >> /etc/hosts
echo "192.168.80.120 www.benet.com" >> /etc/hosts
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
  server {
    listen 192.168.80.20:80;
    server_name  www.jzm.com;
    charset utf-8;
    access_log logs/www.jzm.access.log;
    location / {
      root   /var/www/html/jzm;
      index  index.html index.php;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   html;
    }
  }
  server {
    listen 192.168.80.120:80;
    server_name www.benet.com;
    charset utf-8;
    access_log logs/www.benet.access.log;
    location / {
      root /var/www/html/benet;
      index index.html index.php;
    }
    error_page 500 502 503 504 /50x.html;
    location = 50x.html{
      root html;
    }
  }
}

systemctl restart nginx
#浏览器访问
http://192.168.80.20/
http://192.168.80.120/

基于端口的 Nginx 虚拟主机

vim /usr/local/nginx/conf/nginx.conf
......
http {
......
  server {
    listen 192.168.80.20:80;
    server_name  www.jzm.com;
    charset utf-8;
    access_log logs/www.jzm.access.log;
    location / {
      root   /var/www/html/jzm;
      index  index.html index.php;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   html;
    }
  }
  server {
    listen 192.168.80.120:8080;
    server_name www.benet.com;
    charset utf-8;
    access_log logs/www.benet.access.log;
    location / {
      root /var/www/html/benet;
      index index.html index.php;
    }
    error_page 500 502 503 504 /50x.html;
    location = 50x.html{
      root html;
    }
  }
}	

systemctl restart nginx
浏览器访问
http://192.168.80.20:8080
http://192.168.80.120:8888

到此这篇关于Nginx虚拟主机的搭建的实现步骤的文章就介绍到这了,更多相关Nginx虚拟主机的搭建内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
解析在浏览器地址栏输入一个URL后发生了什么
Jun 21 Servers
使用 Apache Dubbo 实现远程通信(微服务架构)
Feb 12 Servers
Apache Linkis 中间件架构及快速安装步骤
Mar 16 Servers
HDFS免重启挂载新磁盘
Apr 06 Servers
Nginx配置根据url参数重定向
Apr 11 Servers
Nginx+Tomcat负载均衡多实例详解
Apr 11 Servers
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
Apr 29 Servers
阿里云服务器Ubuntu 20.04上安装Odoo 15
May 20 Servers
Nginx 配置 HTTPS的详细过程
May 30 Servers
Docker与K8s关系介绍不会Docker也可以使用K8s
Jun 25 Servers
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
Jun 25 Servers
源码安装apache脚本部署过程详解
Sep 23 Servers
Nginx下SSL证书安装部署步骤介绍
Dec 06 #Servers
教你快速构建一个基于nginx的web集群项目
Nov 27 #Servers
Linux安装apache服务器的配置过程
Nov 27 #Servers
Nginx配置https的实现
nginx内存池源码解析
苹果M1芯片安装nginx 并且部署vue项目步骤详解
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
Nov 17 #Servers
You might like
咖啡语言
2021/03/03 咖啡文化
Zend Framework教程之Application和Bootstrap用法详解
2016/03/10 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
jquery实现倒计时小应用
2017/09/19 jQuery
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
jquery.pager.js分页实现详解
2019/07/29 jQuery
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
浅谈webpack和webpack-cli模块源码分析
2020/01/19 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
Python jieba库分词模式实例用法
2021/01/13 Python
中学劳技课教师的自我评价
2014/02/05 职场文书
教师产假请假条
2014/04/10 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
python实现语音常用度量方法的代码详解
2021/05/25 Python
Golang并发操作中常见的读写锁详析
2021/08/30 Golang