(1) Nginx是一个开源(直接获取源代码) 且 高性能(支持海量并发)、可靠的(服务稳定 ) Http Web服务、代理服务。
(2) Nginx采用Epool网络模型,Apache采用select模型
Epoll: 当用户发起请求,epoll模型会直接进行处理,效率高效,并无连接限制。
Select: 当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。
(3) Nginx和Apache的区别
Nginx: 占用资源少、抗并发(Epool网络模型)、处理静态文件好(是apache的3倍以上)、高度模块化(容易编写模块)、配置简单(可以正则配置)、可以作为web、负载,代理服务器
Apache:
Apache的rewrite(跳转)比nginx强大、apache成熟稳定bug少(nginx较多)、apache对PHP支持简单(nginx需要配合其他后端用)apache对处理动态有优势(nginx鸡肋,nginx适合静态和反向)
防资源盗用: 做个防盗,不让其他的网站用调用自己的图片
正向代理: 用户通过nginx出去上网,可以设置用户不同的用户,分配不同的公网ip
反向代理: nginx作为负载,负载均衡,带着用户访问web
(5) 静态和动态web软件
静态WEB软件:
nginx、
apache、
IIS、
lighttpd、
tengine、
openresty-nginx、
动态web软件:
Tomcat、
Resin、
weblogic、
Jboss
安装方式
配置官方yum源
安装Nginx服务
启动并设置开机自启
验证是否成功
检查nginx的软件版本
检查nginx的编译参数
Nginx两种管理方式
nginx配置文件:/etc/nginx/nginx.conf
核心模块:
user nginx; #nginx进程运行的用户
worker_processes 1; #nginx工作的进程数量,工作中配置为和核心数量相同
error_log /var/log/nginx/error.log warn; #nginx的错误日志【警告及其警告以上的都记录】
pid /var/run/nginx.pid; #nginx进程运行后的进程id
事件模块:
events {
worker_connections 1024; #一个work进程的最大连接数,默认1024 65535
use epool; #使用epoll网络模型
}
http核心层模块:
http {
include /etc/nginx/mime.types; #包含资源类型文件,媒体类型,如上面的文件中没有请求的类型,默认为下载
default_type application/octet-stream; #默认以下载方式传输给浏览器(前提是该资源在mime.types中无法找到)
日志格式定义
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; #包含哪个目录下面的*.conf文件,每个conf文件对应一个网站
server { 定义一个网站
listen 80; #监听端口
server_name localhost; #nginx的域名
#charset koi8-r; #字符集
location / { #位置,匹配规则,规定了用户默认访问的目录是哪一个
root /usr/share/nginx/html; #代码的主文件位置
index index.html index.htm; #服务端默认返回给用户的文件
}
location /test { #位置
root /code/test/123/; #代码的主文件位置
index index.html index.htm; #服务端默认返回给用户的文件
}
}
http server location扩展了解项
http{}层下允许有多个Server{}层,一个Server{}层下又允许有多个Location
http{} 标签主要用来解决用户的请求与响应。
server{} 标签主要用来响应具体的某一个网站。
location{} 标签主要用于匹配网站具体URL路径。
Nginx配置文件相关
/etc/nginx/nginx.conf # Nginx主配置文件 包含了default.conf
/etc/nginx/conf.d/default.conf # Nginx的主配置文件 属于Nginx.conf 中的
/var/log/nginx/access.log # 访问nginx的日志
/var/log/nginx/error.log # 访问Nginx报错的日志
小技巧:非常重要,写完配置文件的时候,务必要Nginx自查!!! 如果要是没检查,配置文件错错的话,服务会直接停止
(1) 编写Nginx配置文件
[root@web01 conf.d]# cat game.conf
server {
listen 80;
server_name game.oldboy.com;
location / {
root /code;
index index.html;
}
}
(2) 根据配置文件,创建目录,上传代码
[root@web01 ~]# mkdir /code
[root@web01 ~]# cd /code
[root@web01 code]# rz html5.zip
[root@web01 code]# unzip html5.zip
(3)重载nginx服务
[root@web01 code]# systemctl reload nginx #平滑重启
[root@web01 code]# systemctl restart nginx #立即重启
(4) 配置域名解析
Windows: C:\Windows\System32\drivers\etc\hosts
10.0.0.7 game.oldboy.com
Mac sudo vim /etc/hosts
10.0.0.7 game.oldboy.com
(5)通过浏览器访问对应的项目
game.oldboy.com
小提示:
用户请求的路径:http://game.oldboy.com/game/duxinshu/index.html
实际上服务器查找的路径: /code/game/duxinshu/index.html
http://game.oldboy.com/game/yyncl/
code/game/yyncl/index.html
小技巧:
(1)配置多网卡多IP的方式
[root@web01 conf.d]# cat ip.conf
server {
listen 10.0.0.7:80;
server_name _;
location / {
root /code_ip_eth0;
index index.html;
}
}
server {
listen 172.16.1.7:80;
server_name _;
location / {
root /code_ip_eth1;
index index.html;
}
}
(2)根据配置创建目录
[root@web01 conf.d]# mkdir /code_ip_eth0
[root@web01 conf.d]# echo "Eth0" > /code_ip_eth0/index.html
[root@web01 conf.d]# mkdir /code_ip_eth1
[root@web01 conf.d]# echo "Eth1" > /code_ip_eth1/index.html
(3)重启nginx服务
[root@web01 conf.d]# systemctl restart nginx
(4)使用curl命令测试
[root@web01 ~]# curl 172.16.1.7
Eth1
[root@web01 ~]# curl 10.0.0.7
Eth0
(1)配置多端口的虚拟主机
[root@web01 conf.d]# vim port.conf
server {
listen 81;
location / {
root /code_81;
index index.html;
}
}
server {
listen 82;
location / {
root /code_82;
index index.html;
}
}
(2)根据配置文件创建所需的目录
[root@web01 conf.d]# mkdir /code_8{1..2}
[root@web01 conf.d]# echo "81" > /code_81/index.html
[root@web01 conf.d]# echo "82" > /code_82/index.html
(3)检查语法并重启服务
[root@web01 conf.d]# ngin x -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 conf.d]# systemctl restart nginx
(4)如何去访问
http://10.0.0.7:82/
(1)准备多虚拟主机配置文件
[root@web01 conf.d]# cat test1.oldboy.com.conf
server {
listen 80;
server_name test1.oldboy.com;
location / {
root /code/test1;
index index.html;
}
}
[root@web01 conf.d]# cat test2.oldboy.com.conf
server {
listen 80;
server_name test2.oldboy.com;
location / {
root /code/test2;
index index.html;
}
}
(2)根据配置文件创建对应的目录
[root@web01 conf.d]# mkdir /code/test{1..2} -p
[root@web01 conf.d]# echo "test1_server" > /code/test1/index.html
[root@web01 conf.d]# echo "test2_server" > /code/test2/index.html
[root@web01 conf.d]# nginx -t
[root@web01 conf.d]# systemctl restart nginx
(3) 配置域名解析
10.0.0.7 test1.oldboy.com
10.0.0.7 test2.oldboy.com
(4)通过浏览器访问该网站
(2)nginx默认日志格式语法如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
(3) Nginx日志格式允许包含的内置变量
$remote_addr # 记录客户端IP地址
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$time_iso8601 # 记录ISO8601标准格式下的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒。
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time # 请求花费的时间,单位为秒,精度毫秒
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。
(4)access_log日志配置语法
意思就是,你的日志的格式你定义好了,然后直接调用那个格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wmqnnSBP-1639931026003)(D31E30D30FF2491AAF185208E148D64D)]
(5)Nginx Access日志配置实践
server {
listen 80;
server_name code.oldboy.com;
#将当前的server网站的访问日志记录至对应的目录,使用main格式
access_log /var/log/nginx/code.oldboy.com.log main;
location / {
root /code;
}
#当有人请求改favicon.ico时,不记录日志
location /favicon.ico {
access_log off;
return 200;
}
location /favicon.ico {
# 将图标保存到指定的访问目录
root /data/nginx/html ;
}
}
使用logrotate切割日志
[root@nginx conf.d]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天切割日志
missingok # 日志丢失忽略
rotate 52 # 日志保留52天
compress # 日志文件压缩
delaycompress # 延迟压缩日志
notifempty # 不切割空文件
create 640 nginx adm # 日志文件权限
sharedscripts
postrotate # 切割日志执行的命令
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
日志切割后的效果
[root@oldboy ~]# ll /var/log/nginx/
total 4044
-rw-r----- 1 www adm 54438 Oct 12 03:28 access.log-20181012.gz
-rw-r----- 1 www adm 28657 Oct 13 03:48 access.log-20181013.gz
-rw-r----- 1 www adm 10135 Oct 12 03:28 error.log-20181130.gz
-rw-r----- 1 www adm 7452 Oct 13 03:48 error.log-20181201.gz
(1)微服务:就类似于soa 京东的模式,把多个功能分块坏,不至于坏一个功能,整个功能都坏掉。云架构、中间层:代理的形式
(2)一台服务器最大的连接时65535,只有这么多的端口,一个连接可能会打开多个文件描述符,文件描述符可以调大一点。
(3)动静分离:动态的数据和静态的数据分开处理
nginx能做缓存服务,很多cdn公司拿nginx做的缓存
(4)web服务都仅仅处理静态资源html css js 字体 doc mp4都属于静态资源
直接通过磁盘,返回给用户,然后浏览器做一次加载,人类可识别的
(5)动态资源:需要查询数据库 ,通过内存,加载解析,然后返回要给页面给用用户的
–lock-path=/var/run/nginx.lock锁路径就是nginx启动,就会touch一个文件出来,防止再次启动
(6)nginx -t 检查语法错误
systemctl status nginx -l 可以详细的看看报错
(7)nginx 回车启动–>再源码编译的时候会使用,再源码编译的时候,并没有给我们提供,nginx启动和停止的管理配置文件。 systemctl 用yum装会提供
注意: 这两种方式不能混着用,只能用一种
(8)如果cpu的核心数是16,就会把work_pricesses 改成16。每个核心可以处理2-3w,这个不好说。
(9)再event时间模块nginx默认使用的就是epoll网络模式,可以再时间里面不用写
(10)长连接的超时时间:如果用户不在点击页面,超过了超时时间,然后自动断开连接
(11)/etc/nginx/mime.types 资源类型与我呢间的对应,如果访问的文件没有对应关系,直接点击的话,会下载文件,如果有的话可以在线访问,也可以下载(鼠标右击选下载)。
(12)再生产上面一般用平滑重启,windows域名解析 /windows/system32/drivers/etc/hosts
(13)直接再/etc/nginx/conf.d/ 多加一个配置文件,多加一个server相当于多加一个网站 ,server_name ;""代表是空,可以用ip去访问
(14)
listen 10.0.0.7:80 只能通过10.0.0.7才能访问我的80端口,如果只写80端口,不管是eth0
还是eth1都能访问我的网站
(15)这里把default.conf文件给删除了,如果不想删,则使用gzip default.conf进行压缩,因为这个和ip.conf都是通过ip访问的,以免冲突,所以以后再测试的时候,一面冲突,把不需要的改个名字,或者压缩一个压缩包
(16)在/etc/nginx/nginx.conf 下 nginx -t 检查语法 没问题了在进行重启nginx,就这个文件中有/etc/nginx/conf.d/*.conf
(17)多IP的方式不好记。访问一个IP,一个IP对应不同端口,不同的端口对应不同的项目,
在公司的内部用的还是比较多的,因为没有域名,访问不同的端口来实现。这个不适合对外,端口被人记不住。这几个项目是公司内部人使用的,这时候没有域名,这时
就用端口的方式解决,只限于企业内部用,对外不用这个
(18)基于多个hosts名称方式(多域名方式)最最常用的一种方式
可以把多个server写入一个文件中,也可以分成多个文件 比如 vhost1.conf vhost2.conf
如果不想开哪个站点,直接gzip关掉即可
每一个域名写一个配置文件
(19)
会把请求抛给http,http会询问谁的server_name是 test3.oldboy.com,当找不到server_name域名
匹配的时候,又把域名解析到我的服务器上面来了,选择一个配置文件名最靠前的文件名给你
(20)nginx -t 是检查的是这一个配置文件/etc/nginx/nginx.conf
如果是第三行出问题了,则vim +3 1.sh 直接定位到第三行
在重启nginx的时候一定要检查语法,一旦写错了,在检查nginx会把nginx杀掉了,起不来了,这个网站马上就崩了,一定要先检查语法,然后再systemctl reload nginx
(21)服务没起来怎么查(nginx -t),服务起来怎么查(/var/log/nginx/error_)
(22)日志切割:用yum安装之后,就会有个程序
这个logrotate服务默认系统是有的,只是nginx提供一个日志切割文件,来
使用这个服务,给nginx主机名发送一个信号,告诉他重新把日志文件
reload一下
(23)zcat 可以查看.zip压缩包里面的内容 但是仅次于压缩包里只有一个文件
(24)/etc/logrotate.d/nginx 这个文件不用调整,不用动
用yum安装的话不用写脚本,直接提供配置文件
用源码安装的可能会写脚本
(25)虚拟主机:一个nginx上面跑多个项目。多域名虚拟主机(重要),其他的不重要
(26)ping -c1 -W1 10.0.0.1
-c 1 要求回应的次数(1次)
-W 1 在1秒后退出
(27)curl -I 10.0.0.7:/index.html 使用这个返回的是头部消息
(28) nginx的进程
(29) 连接放到页面上就是网页 ,/var/log/httpd/error
(30) 查看dns的过程
yum -y install bind-utils
nslookup