Nginx网站服务【☆☆☆】

市面上常用Linux的web服务器:apache、Nginx。

apache与nginx的区别?

  1. 最核心的区别在于NGINX采用异步非阻塞机制,多个连接可以对应一个进程;apache采用的是同步阻塞多进程/线程模型,一个连接对应一个进程。
  2. apache美国公司开发的;nginx是俄罗斯公司开发的;
  3. Nginx抗并发性能更高;
  4. Nginx更轻量,内存CPU资源消耗更少;
  5. Nginx配置简洁,使用场景多,稳定性高;
  6. Nginx处理静态页面性能最好,nginx本身没有动态页面处理能力(可以通过反向代理做负载均衡实现动态页面)
  7. apache的模块更丰富,更稳定,bug少(但好的有限)。

nginx的应用场景

  1. 用作web网站服务,处理http静态页面请求;
  2. 用作虚拟主机,实现一个服务器用于做多个网站站点; 
  3. 用作反向代理、负载均衡,可以作为网关代理服务器接收客户端的请求转发给后端节点服务器集群

---------------------------------------------------------------------------------------------------------------------------

一、Nginx服务安装

1.初始化操作,(防火墙在生产环境中需要开启一些必要端口),安装编译依赖包,下载软件包

nginx: download,一般用的是stable version稳定版本 

[root@pyx ~]# setenforce 0
setenforce: SELinux is disabled
[root@pyx ~]# systemctl stop firewalld
[root@pyx ~]# cd /opt
[root@pyx opt]# ls
rh
[root@pyx opt]# rm -rf *
[root@pyx opt]# rz -E                      #上传NGINX软件包
[root@pyx opt]# tar zvxf nginx-1.12.0.tar.gz
[root@pyx opt]# ls
nginx-1.12.0  nginx-1.12.0.tar.gz
[root@pyx opt]# yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
[root@pyx opt]# useradd -M -s /sbin/nologin nginx

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

  --help                             print this message

  --prefix=PATH                set installation prefix指定安装路径
  --sbin-path=PATH          set nginx binary pathname指定二进制文件存放路径
  --modules-path=PATH   set modules path模块文件存放路径
  --conf-path=PATH          set nginx.conf pathname配置文件存放路径
  --error-log-path=PATH   set error log pathname错误日志
  --pid-path=PATH            set nginx.pid pathname   pid文件
  --lock-path=PATH           set nginx.lock pathname锁定文件

  --user=USER                  set non-privileged user for    指定运行用户
                                      worker processes
  --group=GROUP            set non-privileged group for   指定组用户
                                       worker processes

  --build=NAME                 set build name
  --builddir=DIR                 set build directory

--with开启模块,--without关闭模块

[root@pyx opt]# cd nginx-1.12.0/
[root@pyx nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
#--prefix=/usr/local/nginx       指定安装路径    
#--user=nginx                    指定运行用户
#--group=nginx                   指定组用户
#-with-http_stub_status_module   开启状态统计模块
#--with-http_ssl_module          开启ssl-http模块,网站用到http协议必须要有的模块
[root@pyx opt]# make -j 2
[root@pyx nginx-1.12.0]# make install
[root@pyx nginx-1.12.0]# cd /usr/local/
[root@pyx local]# ls
bin  etc  games  include  lib  lib64  libexec  nginx  sbin  share  src
[root@pyx local]# cd nginx/
[root@pyx nginx]# ls
conf  html  logs  sbin
[root@pyx nginx]# ls sbin
nginx
[root@pyx nginx]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/   #放到环境变量目录中
[root@pyx nginx]# ng(tab补全,就能看大nginx软件了)
ngettext  nginx  

 (yum在线源安装的话配置如下)

3.启动、关闭、重载 、重新生成日志文件、升级nginx程序

①启动

#开启NGINX
[root@pyx nginx]# netstat -lntp | grep :80        #确保没有开启apache,否则会端口冲突
[root@pyx nginx]# /usr/local/nginx/sbin/nginx 
[root@pyx nginx]# netstat -lntp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14440/nginx: master 
[root@pyx nginx]# ls logs/
access.log  error.log  nginx.pid                  #开启nginx后会在logs目录中生成它的pid文件    
[root@pyx nginx]# cat logs/nginx.pid 
14440                                             #与之前查看的进程号是一致的

 ②关闭

#关闭NGINX
kill -3 pid号      或  kill -s QUIT pid号        kill -3杀进程同时会发送堆栈信息
killall -3 nginx   或  killall -s QUIT nginx
或者nginx -s 信号种类(stop/quit/reopen/reload)管理进程
-------------------------------------------------------------------------------------------
[root@pyx ~]# nginx -s quit
[root@pyx ~]# netstat -lntp | grep :80

 ③重载

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

④重新生成日志文件 

#重建nginx日志,日志分割,重新打开日志文件
kill -USR1 <PID号>
-------------------------------------------------------------------------------------
[root@pyx nginx]# cd logs/
[root@pyx logs]# ls
access.log  error.log  nginx.pid
[root@pyx logs]# rm -f *.log
[root@pyx logs]# ls
nginx.pid
[root@pyx logs]# kill -USR1 $(cat nginx.pid)    #获取PID号
[root@pyx logs]# ls
access.log  error.log  nginx.pid

 ⑤平滑升级nginx

先从官网下载最新的软件包,上传到nginx服务器中进行解压,到软件包目录里./configuer按照原有的配置进行配置(时间长忘了的话可以nginx -V查看),make编译。然后把生成的位于/objs/中的二进制文件复制替换掉/usr/local/nginx/sbin中原来的程序,用make upgrade平滑升级。

#平滑升级
[root@pyx logs]# cd /opt/
[root@pyx opt]# ls
nginx-1.12.0  nginx-1.12.0.tar.gz
[root@pyx opt]# rz -E
[root@pyx opt]# ls
nginx-1.12.0  nginx-1.12.0.tar.gz  nginx-1.26.0.tar.gz
[root@pyx opt]# tar xf nginx-1.26.0.tar.gz 
[root@pyx opt]# ls
nginx-1.12.0  nginx-1.12.0.tar.gz  nginx-1.26.0  nginx-1.26.0.tar.gz
[root@pyx opt]# cd nginx-1.26.0/
[root@pyx nginx-1.26.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
[root@pyx nginx-1.26.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
[root@pyx nginx-1.26.0]# ls
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README
[root@pyx nginx-1.26.0]# make -j 2        #编译生成二进制文件
[root@pyx nginx-1.26.0]# ls
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README
[root@pyx nginx-1.26.0]# cd objs/        #二进制文件存放在objs中
[root@pyx objs]# ls
autoconf.err  nginx    ngx_auto_config.h   ngx_modules.c  src
Makefile      nginx.8  ngx_auto_headers.h  ngx_modules.o
[root@pyx objs]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old   
#把nginx-1.12.0的程序文件名名改一下
[root@pyx objs]# cp nginx /usr/local/nginx/sbin/        #把新的nginx程序文件复制过来
[root@pyx objs]# cd /usr/local/nginx/sbin/
[root@pyx sbin]# ls
nginx  nginx_old
[root@pyx sbin]# cd /opt/nginx-1.26.0/                  #回到新版的安装包目录
[root@pyx nginx-1.26.0]# ls
auto     CHANGES.ru  configure  html     Makefile  objs    src
CHANGES  conf        contrib    LICENSE  man       README
[root@pyx nginx-1.26.0]# make upgrade                   #更新
#要保证当前 nginx 进程是通过 /usr/local/nginx/sbin/nginx 启动的,而不是通过查找环境变量中那个 nginx 命令启动的
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`  
#能看到上面也是用kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`获取进程号的。
#要保证当前 nginx 进程是通过 /usr/local/nginx/sbin/nginx 启动的,而不是通过查找环境变量中那个 nginx 命令启动的
[root@pyx nginx-1.26.0]# nginx -v
nginx version: nginx/1.26.0                             #获取nginx的版本
---------------------------------------------------------------------------------------
此处注意,我旧版是1.12,新版是1.26,在添加systemctl管理时报错,这里后面重新做个软链接就可以正常使用了。
[root@pyx nginx-1.26.0]# rm -f /usr/local/sbin/nginx
[root@pyx nginx-1.26.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

 4.添加nginx系统服务,实现使用systemctl来管理nginx

准备一个.service为结尾的文件
[Unit]: 设置nginx服务的说明、描述、依赖
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务,nginx要在network之后运行
[Service]服务运行参数的设置
Type=forking表示后台启动
ExecStart指定nginx的启动路径(绝对路径)
ExecReload为重载nginx服务,$MAINPID是system的一个变量,可以通过PID文件获取nginx主进程的pid号                
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,在什么级别去运行,可设置为多用户

方法一:
#先写nginx脚本文件
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20           #设置nginx服务开启自启,-表示关闭服务开机自启,2345表示运行级别2、3、4、5,第99个启动第20个关闭
#description:Nginx Service Control Script
COM="/usr/local/nginx/sbin/nginx"         变量COM获取nginx的运行路径
PID="/usr/local/nginx/logs/nginx.pid"     变量PID获取nginx的PID文件路径
case "$1" in
start)
  $COM
;;

stop)
  kill -s QUIT $(cat $PID)
;;

restart)
  $0 stop		$0表示脚本本身,关闭nginx
  $0 start		$0表示脚本本身,启动nginx,从而达到重启的效果
;;

reload)
  kill -s HUP $(cat $PID)
;;

*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1

esac
exit 0

-------------------------------------------------------------------------------------------
#添加文件权限,添加为系统服务
[root@pyx nginx-1.26.0]# chmod -x /etc/init.d/nginx
[root@pyx nginx-1.26.0]# chkconfig --add nginx
[root@pyx nginx-1.26.0]# systemctl stop nginx 
方法二:
#在/lib/systemd/system/目录下创建nginx.service文件
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		  				
ExecReload=/bin/kill -s HUP $MAINPID		 				
ExecStop=/bin/kill -s QUIT $MAINPID		  		
PrivateTmp=true							  	
[Install]									  		
WantedBy=multi-user.target	
-------------------------------------------------------------------------------------------
#添加到systemctl管理服务
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.serviceng
方法三:直接通过nginx的yum仓库安装nginx服务,能够直接使用systemctl管理服务
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
local.repo  repo.bak
[root@localhost yum.repos.d]# rz -E
[root@localhost yum.repos.d]# ls
local.repo  nginx.repo  repo.bak
[root@localhost yum.repos.d]# yum install -y nginx
[root@localhost yum.repos.d]# systemctl start nginx
[root@localhost yum.repos.d]# netstat -lntp | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4186/nginx: master
[root@localhost yum.repos.d]# cd /usr/lib/systemd/system/     
#检验在这个目录下是否生成nginx的配置文件
[root@localhost system]# ls ./ | grep nginx
nginx-debug.service
nginx.service
[root@localhost system]# cat nginx.service 
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"

[Install]
WantedBy=multi-user.target

二、Nginx服务的主配置文件nginx.conf

1)nginx主配置文件位置 

2)nginx的进程分为主进程和工作进程

  1. 主进程mster process:负责管理worker工作进程,一个主进程可以跟多个工作进程;加载配置文件。

  2. 工作进程worker process:处理连接请求的

3)nginx配置文件分以下几个块

1、全局块:全局配置,对全局生效;
2、events块:配置影响 Nginx 服务器与用户的网络连接,可以理解为IO配置
3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
4、server块配置虚拟主机的相关参数,一个 http块中可以有多个 server 块,一个server块相当于一个代理或者一台虚拟主机;
5、location块用于配置匹配的uri
6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。

nginx配置中以“;”结尾表示一行内容结束。

1.全局配置

#user nobody;          #运行用户,若编译时未指定则默认为 nobody
worker_processes 1;    #设置工作进程数量,一般设置为和 CPU核数一样;默认为1;设置为auto,nginx将会自己获取当前系统的CPU数值
#error_log logs/error.log;     #错误日志文件的位置位于logs目录下
#pid logs/nginx.pid;           #PID 文件的位置位于logs目录下
worker_rlimit_nofile 65535;    #指定worker子进程可以打开的最大文件句柄数,默认为1024(软件层级理论上支持65535的并发,但实际操作系统每个用户能个打开的文件数也是有限制的)

cpu核心数怎么查看:lscpu、cat /proc/cpuinfo、top等命令。注意:进程数到8核之后就效果不明显了,而且很少情况下给很大的服务器安装nginx,也不要需要分配给nginx高资源的服务器。

2.event块配置(IO事件配置)

use epoll; 		#使用 epoll I/O模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 65535; 	#每个 worker 子进程能够处理的最大并发连接数
multi_accept on;            #是否一次性将监听到的连接全接收进来,默认为off,关闭时一次接收一条连接
accept_mutex on;            #默认为on,开启时表示以串行方式接入新连接,否则将通报给所有worker。这可能会浪费资源并产生不可预计的后果,例如惊群问题,在nginx里是一个连接进来,会激活所有的工作进程,会导致cpu资源被大大的浪费。

3.http块配置

http块中可以有多个server块

http {
	##文件扩展名与文件类型映射表
    include       mime.types;  #include可以加载另外一个文件的配置。mime.types位于/usr/local/nginx/conf目录中,包含nginx支持的相关的网页类型文件格式等
	##默认使用的文件类型
    default_type  application/octet-stream;
	##指定访问日志记录名称为main和格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
	##指定访问日志的保存位置,main是我们上面设置的格式
    #access_log  logs/access.log  main;
	##开启高效的文件传输模式
    sendfile        on;
	##建议开启tcp_nopush和tcp_nodelay用于防止网络阻塞
    tcp_nopush     on;
    tcp_nodelay    on;
	##连接保持超时时间,单位是秒
    #keepalive_timeout  0;
    keepalive_timeout  65;
	##gzip模块设置,设置是否开启gzip压缩输出,减少传输数据包的大小,速度更快
    #gzip  on;
	
	server { 
            ······
    }
}

变量名作用
$remote_addr与$http_x_forwarded_for

用以记录客户端的ip地址。

$remote_add只会记录上一层服务器的地址,获取不到真实的客户端地址;

$http_x_forwarded_for会记录数据包沿途经过的所有ip地址,能记录到真实的客户端地址。

$remote_user用来记录客户端用户名称
$time_local用来记录访问时间与时区
$request用来记录请求的url与http协议
$status用来记录请求状态返回码;成功是200
$body_bytes_sent记录发送给客户端文件主体内容大小
$http_referer用来记录从哪个页面链接访问过来的
$http_user_agent记录客户浏览器的相关信息

 4.server块配置

server块中可以有多个location块匹配用户的访问路径

	##Web服务的监听配置
	server { #server表示站点的配置,每个站点可以设置为一个server,server就是虚拟机
		##监听地址及端口,每个站点的地址和端口号可以不一样,如果只有端口,默认监听任意地址
		listen 80; 
		##设置站点域名,可以有多个,用空格隔开
		server_name www.kgc.com; 
		##网页的默认字符集
		charset utf-8;
		
        location / {
            ......
		}
		
        location /xxx {
            ......
		}

        location /xxx {
            ......
		}

		##内部错误的反馈页面
		error_page 500 502 503 504 /50x.html;
		##错误页面配置
		location = /50x.html {
			root html;
		}
    }

5.location块配置

location默认前缀匹配,默认从/根目录开始匹配

location / {
	##设置网站根目录的位置/usr/local/nginx/html
	root html;
	##设置默认首页文件名,注意匹配
	index index.html index.htm index.php;
}

location常见配置指令:root、alias、proxy_pass

  1. root 根路径配置,可以写在 http、server、location 等配置中:                                            如root /var/www/html                                                                                                              请求www.xy101.com/test/1.html,会返回文件/var/www/html/test/1.html
  2. alias 别名配置,只能写在 location 中:                                                                                 如alias /var/www/html/ (  注:使用 alias 末尾要添加 /  )                                                       请求www.kgc.com/test/1.html,会返回文件/var/www/html/1.html
  3. proxy_pass(反向代理配置)
     

nginx 的 root 和 alias 指定路径的区别?

①root(根目录)
location /abc {
    root /var/www;
}
处理方式: root路径+location路径    

http://192.168.80.200/abc/xy101/scj.html  -->  /var/www/abc/xy101/scj.html

②alias(别名目录、虚拟目录)
location /abc {
    alias /var/www;               
}
处理方式: alias路径替换location路径

 http://192.168.80.200/abc/xy101/scj.html  -->   /var/www/xy101/scj.html

访问路径示例

客户输入的访问文件路径实际访问到的服务端文件路径
http://192.168.170.200/index.html/usr/local/nginx/html/index.html
http://192.168.170.200/(没有指定文件)/usr/local/nginx/html/index.html访问默认的文件,如果没有index.html则访问index.htm
http://192.168.170.200/abc/scj.html前缀最长匹配/abc,则为/var/www/html/abc/scj.html
http://192.168.170.200/test/scj.html前缀test匹配不到,所以匹配根目录,则为/usr/local/nginx/html/test/index.html
http://192.168.170.200/nba/scj.html

前缀最长匹配/nba,则访问/var/www/html/scj.html

三、nginx服务配置内容

1)Nginx 设置最大并发量

①软件层面

nginx应用程序配置文件设置  
worker_processes            #工作进程数,一般设置为与CPU数量相同,或auto    
worker_connections          #每个worker进程能够处理的连接数
worker_rlimit_nofile 65535  #设置每个worker进程最大可以打开的文件数

②系统层面

nginx服务器系统设置    ulimit -n  65535                                                    
#指定进程能够打开的文件数
vim /etc/security/limits.conf  -->    *  soft  nofile  65535
                                      *  hard  nofile  65535

2)nginx 平滑升级

先下载最新软件包上传到系统,然后进入最新的软件包找到configure文件所在目录使用./configure按照原配置升级(原配置nginx -V),再用make编译升级成二进制文件,把新的nginx二进制文件替换掉原来的nginx程序文件,然后再新版软件包的目录使用make upgrade或kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)进行平滑升级即可。版本之间不要跨步太大,可能会出现异常。

3)nginx 访问状态统计

1、安装nginx时添加状态统计模块 ./configure --with-http_stub_status_module。适用nginx -V查看安装时是否开启访问状态统计模块。查看软件包目录中的options目录cat /opt/nginx-1.26.0/auto/options | grep YES ,可查看 nginx 已开启的模块。(--with表示开启某个模块,--without表示关闭模块)

2、修改配置文件/usr/local/nginx/conf/nginx.conf,添加开启状态统计功能的location块配置: stub_status on;  access_log off;修改配置后重载nginx

3、测试验证

  • 浏览器访问http://192.168.170.200/ngx-state
  • curl -s http://192.168.170.200/ngx-state(curl相当于Linux命令行的客户端)

补充:如何获取当前nginx服务器的并发量?写个定期检查nginx并发量,过高则告警的脚本。

理论并发量=worker_processes*worker_connections

(思路:确保开启状态统计模块 --with-http_stub_status_module ,配置文件中也要开启状态统计功能 stub_status on; 开启访问状态统计页面,看 Active connections: 行的数组)

方法①curl -s http://192.168.170.200/ngx-state | awk '/Active connections/ {print $NF}'

方法②ss/netstat -antp | grep nginx | grep -c ESTAB

可以写一个并发过高就报警的脚本:把第一种方法命令得到的值赋给一个变量,if语句如果变量的值超过多少就告警,加入计划性任务重定期检查。

4)nginx 访问认证

实现网页的认证

1.安装 httpd-tools 软件包,获得htpasswd 命令工具,使用 htpasswd -c创建一个用户认证文件(路径)+ 密码,并修改文件的归属nginx和权限400(只能用户读取,保障安全性);


2.修改配置文件/usr/local/nginx/conf/nginx.conf,添加 auth_basic   auth_basic_user_file 配置;

3.重启服务,测试验证。

5)nginx 访问控制

匹配规则从上往下,匹配到即停止,配置后重载服务生效

  • 在 http{...}配置块中添加配置(对所有站点生效)  
  • 在 server{...}配置块中添加配置(对当前站点所有的访问路径生效)  
  • 在 location{...}配置块中添加配置(只对当前站点指定的URL访问路径生效)

黑名单配置 deny IP|网段;  

白名单配置 allow IP|网段;    

其他主机配置      deny all;

补充:通过分析访问日志把一分钟内发出10次访问的用户,怀疑在共计我们的服务器,临时禁用一段时间,然后放出来,重新统计的脚本。vim nginx.sh

脚本思路:脚本执行之前现将黑名单文件清空,然后再用分析日志文件分析IP地址出现次数,如果访问次数超过10次,那么会输出deny+ip地址到黑名单文件,然后重载服务,把黑名单文件移走到指定存放的目录中并以指定时间格式命名文件,再去清空当前的日志文件。如果没有超过10也要重载nginx,相当于清空blockip黑名单文件。

测试:几台主机多次访问nginx服务器,使nginx的access.log文件中有大量访问记录。然后命令可以查看访问的主机名和次数,进行禁用操作。

6)nginx虚拟主机类型

1.基于不同域名实现的虚拟主机

生产环境中用的最多的就是基于域名的虚拟主机类型,用不同域名的主机访问同一台服务器的不同站点。

server {
    server_name XXX;         #指定不同的域名
}

要想实现基于域名的nginx虚拟主机实验有以下几个步骤:

①需要准备域名解析

方法一:/etc/hosts文件直接添加解析记录

方法二:配置dns服务器

②服务器准备至少2个站点的网页根目录和网页文件

③修改nginx服务器配置文件,添加站点域名、指定访问日志目录、日志名等,重启服务

④访问测试:使用不同域名访问到同一个nginx服务器下不同站点下的网页文件

2.基于IP的虚拟主机类型

server {
    listen  <IP>:端口;       #指定不同的IP
}

①在nginx服务器准备2个网卡(也可以做虚网卡实现)

②修改nginx配置文件/usr/local/nginx/conf/nginx.conf,重载服务

③验证:使用ip地址访问

3.基于端口的虚拟主机类型

server {
    listen   IP:<端口>;      #指定不同的端口
}

①修改nginx配置文件/usr/local/nginx/conf/nginx.conf,重启nginx服务,确定监听端口号为两个

②验证:使用不同端口号访问

补充:

1.如何设置2个cpu,5万并发量?

配置文件中worker_process设置为2或者auto,再在IOevent块中设置worker_connection至少设置为25000以上,然后再设置每个工作进程打开文件数在全局块中加配置,值与连接数保持一致即可。然后再vim /etc/security/limits.conf  -->    *  soft  nofile  65535
                                                                       *  hard  nofile  65535

2.写个脚本查看访问日志,看有没有主机在攻击

先准备一个空的配置文件,用来存放禁止访问nginx的配置文件,并且在nginx配置文件的include块中加载这个文件。先用awk过滤nginx的访问日志,截取出客户端ip地址字段,用sort对ip地址进行重新排序,用uniq-c统计数,再用awk获取访问次数进行判断,将超过一定值的ip地址过滤出来,用for循环遍历,输出到禁止访问文件中。重载nginx配置文件中的include块

3.前台启动nginx方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682993.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++简略实现共享智能指针Shared_Ptr<T>

重点&#xff1a; 1.引用计数在堆上&#xff08;原本应为原子变量&#xff09; 2.引用计数增加减少需要加锁保证线程安全。 3.内部实现Release函数用于释放资源 4.未实现&#xff0c;增加自定义删除器可以将Release修改为模板函数&#xff0c;传入可调用参数。对于shared_p…

tomcat服务器之maxHttpHeaderSize

背景&#xff1a;在OA流程表单中&#xff0c;填写了200条数据&#xff0c;一提交&#xff0c;秒报400错误&#xff0c;且请求没有打到后端中&#xff08;无报错日志&#xff09;&#xff0c;一开始以为是谷歌浏览器的问题&#xff0c;可百度上关于这个错误的解决方案都是清除缓…

docker实战流程:

Docker-compose是docker官方的开源项目&#xff0c;负责实现对docker容器的集群的快速编排&#xff08;通过yaml文件docker-compose.yml管理写好容器之间的调用关系只需一个命令就能实现容器的通识开启或关闭&#xff09;。 类比spring容器&#xff0c;spring管理的是bean而do…

vue3+uniapp

1.页面滚动 2.图片懒加载 3.安全区域 4.返回顶部&#xff0c;刷新页面 5.grid布局 place-self: center; 6.模糊效果 7.缩放 8.微信小程序联系客服 9.拨打电话 10.穿透 11.盒子宽度 12.一般文字以及盒子阴影 13.选中文字 14.顶部安全距离 15.onLoad周期函数在setup语法糖执行后…

PVE安装虚拟主机

本文记录PVE安装其他虚拟主机的步骤&#xff0c;以安装win-server为例。裸机安装PVE则不是本文主题。 准备文件 获取Windows系统镜像 win server镜像可以从官网获取普通Windows镜像可从MSDN获取此外&#xff0c;安装Windows系统还需要从PVE下载特殊驱动 获取Windows必要驱动 …

数据库(25)——多表关系介绍

在项目开发中&#xff0c;进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;各个表之间的结构基本上分为三种&#xff1a;一对多&#xff0c;多对多&#xff0c;一对一。 一对多 例如&#xff0c;一个学校可以有…

PromptPerfect:AI Prompt生成与优化专家

PromptPerfect&#xff1a;AI Prompt生成与优化专家 PromptPerfect是一款专业的AI Prompt生成与优化工具&#xff0c;旨在帮助用户解锁和最大化GPT-4、ChatGPT、Midjourney等先进AI模型的潜力。它通过智能生成和精细优化Prompt&#xff0c;帮助用户获得更精确、更相关、更高效…

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本&#xff1a;20.10.25 k8s版本&#xff08;kubeadm&#xff0c;kubelet和kubectl&#xff09;&#xff1a;1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …

题号:BC19 题目:反向输出一个四位数

题号&#xff1a;BC19 题目&#xff1a;反向输出一个四位数 废话不多说&#xff0c;上题目&#xff1a; 解题思路&#xff1a; 我们发现可以用%和/两个操作符就可以解决。 代码如下: int main() {int a 0;scanf("%d ",& a);while (a){printf("%d "…

【实物+仿真设计】基于单片机的物流皮带传输监控系统设计

《基于单片机的物流皮带传输监控系统设计 实物仿真》 整体功能&#xff1a; 本设计采用以单片机为核心控制器&#xff0c;以及传感器检测部分作为输入部分&#xff0c;以报警、显示、洒水、排烟、电机停止模块作为输出部分&#xff0c;构成整个物流皮带传输监控系统。 本设计…

Kolmogorov–Arnold Networks (KAN) 即将改变 AI 世界

目录 一、说明 二、KAN介绍 2.1 什么是 Kolmogorov-Arnold Networks &#xff08;KAN&#xff09;&#xff1a; 2.2 KAN 的秘诀&#xff0c;Splines&#xff01; 2.3 了解KAN工作的最简单方法 三、KAN的主要优点 四、KAN 的 Python 实现 &#xff08;PyKAN&#xff09; 4.1 …

神经网络 | 深度学习背后的数学

神经网分析 机器学习处理的是数据&#xff0c;通过学习输入的数据&#xff0c;从而建立模型&#xff0c;以便预测新的数据的输出 按照类型可以进行如下分类 监督分类 非监督分类 强化学习 神经元 生物学中&#xff0c;人的大脑是由多个神经元互相连接形成网络而构成的。也…

访问vue乱码解决

前情提要&#xff1a; 前端 vue工程npm run build生成的dist静态文件 后端 springboot 后端mvn install 生成war包&#xff0c;前端dist放进war包 报错&#xff1a; 页面访问白屏 报错如图 可以看到chunk-vendors.xxxx.js出现了中文乱码&#xff0c;这个js文件是vue build生成的…

2024版本---LabVIEW 软件安装及使用教程

目录 第1章 LabVIEW 软件安装及使用教程 1. 简介 2. 安装教程 2.1 下载 LabVIEW 2024 版本 2.2 安装 LabVIEW 3. 激活 LabVIEW 4. LabVIEW 基本使用教程 4.1 用户界面介绍 4.2 创建一个简单的 VI&#xff08;虚拟仪器&#xff09; 4.3 数据采集示例 5. 进阶功能介绍…

秋招突击——算法打卡——6/5——提高{(状态机模型)股票买卖、(单调队列优化DP)最大子序列和}——新做:{考试的最大困扰度}

文章目录 提高(状态机模型)股票买卖IV思路分析实现代码参考代码 新作考试的最大困扰度个人实现参考思路 总结 提高 (状态机模型)股票买卖IV 上一次的思路总结&#xff0c;上次写的时候忘记总结了&#xff0c;现在重新画一下图 思路分析 这道题是一个经典的状态机模型&#…

【数据挖掘】学习笔记

文章目录 第一章 引论1.1 为什么进行数据挖掘1.2 什么是数据挖掘&#xff1f;1.3 可以挖掘什么类型的数据1.4 可以挖掘什么类型的模式1.4.1 类/概念描述&#xff1a;特征化和区分1.4.2 挖掘频繁模式、关联规则和相关性1.4.3 用于预测分析的分类和回归1.4.4 聚类分析1.4.5 离群点…

【C语言之排序】-------六大排序

作者主页&#xff1a;作者主页 数据结构专栏&#xff1a;数据结构 创作时间 &#xff1a;2024年5月18日 前言&#xff1a; 今天我们就给大家带来几种排序的讲解&#xff0c;包括冒泡排序&#xff0c;插入排序&#xff0c;希尔排序&#xff0c;选择排序&#xff0c;堆排序&…

计算机网络ppt和课后题总结(下)

常用端口总结 计算机网络中&#xff0c;端口是TCP/IP协议的一部分&#xff0c;用于标识运行在同一台计算机上的不同服务。端口号是一个16位的数字&#xff0c;范围从0到65535。通常&#xff0c;0到1023的端口被称为“熟知端口”或“系统端口”&#xff0c;它们被保留给一些标准…

【Python数据类型的奥秘】:构建程序基石,驾驭信息之海

文章目录 &#x1f680;Python数据类型&#x1f308;1. 基本概念⭐2. 转化&#x1f44a;3. 数值运算&#x1f4a5;4. 数值运算扩展(math库常用函数) &#x1f680;Python数据类型 &#x1f308;1. 基本概念 整数&#xff08;int&#xff09;&#xff1a;整数是没有小数部分的数…

保研面试408复习 8——计算机网络(浏览器http)、离散数学(平面图)、操作系统、数据结构

文章目录 一、计算机网络1、从在浏览器输入网址到页面显示的过程1. 输入网址2. DNS 解析3. 建立TCP连接4. 发送HTTP请求5. 服务器处理请求并响应6. 浏览器处理响应7. 页面渲染 二、离散数学一、平面图1、平面图性质2、Kuratowski定理 三、操作系统四、数据结构 一、计算机网络 …