目录
一键编译安装nginx脚本
如何卸载编译安装的nginx?
nginx的升级问题
nginx常用命令
关闭nginx:
重新加载配置文件:
nginx的master和worker的关系:
查看nginx的版本:
检查nginx.conf配置文件是否有误:
nginx的日志
nginx的配置文件
全局配置
http协议相关配置
虚拟主机的配置-server
虚拟主机实验
修改配置文件
在/usr/local/sumeng66/html下新建3个目录,存放3个虚拟主机的index.html页面
重新加载nginx的配置
在Windows里修改hosts文件,进行域名解析
使用浏览器输入不同的域名测试访问
回顾昨天的学习,思考yum安装的nginx和编译安装的nginx是否会发生冲突?能否在机器里编译安装多个nginx?
只要不启动,代码在磁盘里面其实没有什么影响,不会发生冲突;如果启动了,如果没有占用相同的端口也不会发生冲突。冲突的点就是默认想抢占80端口号
也可以在机器里编译安装多个nginx,只要不使用相同的端口,就不会冲突
一个nginx进程对应一个网站,一个网站占用不同的端口
一键编译安装nginx脚本
[root@router nginx]# cat onekey_install_nginx.sh
#!/bin/bash
#新建一个文件夹用来存放下载的nginx源码包
mkdir -p /sumeng_nginx
cd /sumeng_nginx
#新建用户
useradd -s /sbin/nologin sumeng
#下载nginx
curl -O https://nginx.org/download/nginx-1.24.0.tar.gz
#解压nginx源码包
tar xf nginx-1.24.0.tar.gz
#进入解压后的文件夹
cd nginx-1.24.0
#解决依赖关系
yum install epel-release -y
yum install gcc openssl openssl-devel pcre pcre-devel automake make -y
#编译前的配置
./configure --prefix=/usr/local/sumeng66 --user=sumeng --with-http_ssl_module --with-stream --with-http_v2_module --with-threads --with-http_stub_status_module
#编译,开启2个进程同时编译,速度会快些
make -j 2
#将编译好的二进制文件复制到指定的安装路径目录下
make install
#启动nginx--使用绝对路径
/usr/local/sumeng66/sbin/nginx
#修改path变量
PATH=$PATH:/usr/local/sumeng66/sbin
#永久修改
echo "PATH=$PATH:/usr/local/sumeng66/sbin" >>/root/.bashrc
#设置nginx的开机启动
echo "/usr/local/sumeng66/sbin/nginx" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
#关闭防火墙
service firewalld stop
systemctl disable firewalld
#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
如何卸载编译安装的nginx?
直接删除--prefix指定的安装目录,并且在PATH环境变量中删除nginx的安装路径
nginx的升级问题
1.重新编译安装一个新的,会产生短时间的中断
2.采用热升级方式:在不影响客户端请求(服务不中断)的情况下使用新的nginx二级制文件替换老的nginx二进制文件,再停掉老的进程。实现在老的nginx主进程不退出的情况下以子进程的方式启动新的master进程和新的worker进程,让新的master进程重新监听端口和接收请求,新的master进程稳定之后,通过发送信号通知老master进程退出。
nginx常用命令
关闭nginx:
nginx -s stop:快速的停止nginx,立马断开连接
nginx -s quit:等待nginx进程处理任务完毕再停止
重新加载配置文件:
nginx -s reload:当nginx配置文件中做了修改时,master进程会重新加载configuration,来使修改生效,无需重启整个nginx服务,不用停止业务。如果配置文件出现问题,reload不会成功,会继续使用老的配置。
nginx的master和worker的关系:
master管理worker进程,当worker进程死掉会重启一个,master是worker的父进程
当master进程被杀死,worker进程还在就仍然能够提供服务,此时worker进程为孤儿进程,被systemd进程收养,但是当修改了配置文件,要reload nginx时就会出现问题,因为reload是给master进程发送信号的
注意:在指定配置时,--user=name指定的用户启动的是worker进程
查看nginx的版本:
[root@router logs]# nginx -v
nginx version: nginx/1.24.0
检查nginx.conf配置文件是否有误:
[root@router conf]# nginx -t
nginx: the configuration file /usr/local/sumeng66/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/sumeng66/conf/nginx.conf test is successful
[root@router conf]# vim nginx.conf #故意将配置文件改错
[root@router conf]# nginx -t
nginx: [emerg] unknown directive "sumeng" in /usr/local/sumeng66/conf/nginx.conf:3
nginx: configuration file /usr/local/sumeng66/conf/nginx.conf test failed
nginx的日志
[root@router sumeng66]# cd logs/
[root@router logs]# ls
access.log error.log nginx.pid
access.log:记录正常访问网站的日志
error.log:记录访问出错的日志
日志的好处:1.排除故障;2.进行数据分析
日志的等级 -- 从上到下严重级别从小到大
none:不记录日志
debug:调试信息,不属于错误日志
info:一般的通知信息
notice:提醒信息,不理会可能会出错
warning:警告信息,程序可能已经出现了问题,但是不影响程序的正常运行
error:错误信息,服务出现了问题,无法正常启动
critical:比较严重的错误信息,服务可能无法修复了
alert:警报信息,不仅服务宕掉了,还会影响系统的正常运行
emerg:紧急信息,系统可能已经无法使用了
nginx的配置文件
/usr/local/sumeng66/conf/nginx.conf是nginx的主配置文件,配置文件中的每一条配置就是一条指令。分块来详细讲述一下nginx的主配置文件
全局配置
#user nobody; #指定启动nginx worker进程用nobody用户去启动
worker_processes 1; #指定启动1个worker进程,一般与CPU核心数量一致
#error_log logs/error.log; #指定错误日志存放的文件夹
#error_log logs/error.log notice; #记录notice级别以上的日志
#error_log logs/error.log info; #记录info级别以上的日志
#pid logs/nginx.pid; #指定记录master进程pid号的文件
events { #事件:理解为一个用户访问过来就是一个事件
worker_connections 1024; #1个worker进程允许1024个用户访问,即1个worker里产生1024个线程
#一个用户访问过来,就启动一个线程来接待吗,从web服务器里读取数据给用户
}
http协议相关配置
http { #http协议相关的配置
include mime.types;
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"';
#access_log logs/access.log main; #定义访问日志
sendfile on; #零拷贝
#tcp_nopush on; #先将数据进行缓存,达到一定数量后在进行传输,减少网络开销
#keepalive_timeout 0;
keepalive_timeout 65; #连接的超时时间,65s后用户和web服务器建立的连接就会断开
#gzip on; #开启压缩,默认是不开启的
访问日志格式:
$remote_addr:远程服务器的ip,本质上是nginx内部调用某个某个变量的值
$remote_user:远程登录用户
$time_local:本地时间
$request:请求的网址
$status:响应的状态码,200表示成功,404表示网页未找到
$body_bytes_sent:发送的数据
$http_referer:参考的网站--从哪个网站引流(跳转)过来的
$http_user_agent:用户使用的浏览器--用户的代理$http_x_forwarded_for:获取用户的真实ip
虚拟主机的配置-server
虚拟主机有三种类型:
基于域名:一个域名对应一个server,推荐使用
基于ip的虚拟主机:一个网站对应一个公网ip
基于端口的虚拟主机:一个网站对应一个端口
server { #提供web网站服务,一个server对应一个网站
listen 80; #监听80端口
server_name localhost; #为哪个域名提供服务
#charset koi8-r;
#access_log logs/host.access.log main; #访问日志的路径和格式
location / { #定义的路由
root html; #网站的根目录在html文件夹,在nginx安装目录下
index index.html index.htm; #定义访问的时候,第1个被访问的页面,最左边的优先级最高
}
#error_page 404 /404.html; #定义出现404错误的时候,去访问404.html网页
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #出现nginx内部错误,返回/50x.html页面
location = /50x.html { #直接访问/50x.html路由
root html;
}
}
虚拟主机实验
只安装一个nginx,开启3个server(虚拟主机),对应3个域名,一个域名就是一个网站
修改配置文件
[root@router conf]# cat nginx.conf|egrep -v "^$|#"
worker_processes 1;
events {
worker_connections 1024;
}
http {
include 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"';
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.su1.com;
access_log logs/su1.com.access.log main;
location / {
root html/su1;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.su2.com;
access_log logs/su2.com.access.log main;
location / {
root html/su2;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.su3.com;
access_log logs/su3.com.access.log main;
location / {
root html/su3;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
在/usr/local/sumeng66/html下新建3个目录,存放3个虚拟主机的index.html页面
重新加载nginx的配置
[root@router ~]# nginx -s reload
[root@router ~]# nginx -t
nginx: the configuration file /usr/local/sumeng66/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/sumeng66/conf/nginx.conf test is successful
在Windows里修改hosts文件,进行域名解析
hosts文件在Windows里的存放路径:C:\Windows\System32\drivers\etc
小技巧:由于hosts文件不能直接进行修改,所以先将该文件复制一份放在其他文件夹下,修改好后再将原本的hosts文件进行替换
调出cmd行工具测试域名是否生效:
使用浏览器输入不同的域名测试访问