国外主要还是apache
nginx高性能、轻量级的web服务软件。
nginx的特点
1、稳定性高。(没有apache稳定)
常用版本 1.12 1.20 1.22
2、系统资源消耗低。(处理http请求的并发能力很高,单台服务器可以处理30000-50000个并发请求。)
稳定:一般在企业中,为了保证服务器稳定,并发量的设置在20000个左右。占用内存2M左右。加上keep-alive也就3M左右。
nginx的主要功能:
1、静态文件服务:nginx可以直接提供静态文件的服务。HTML,CSS,JAVAScript,可以直接处理图片。
能够高效的处理并且响应静态文件的请求。
2、反向代理(重点,nginx最核心最强大的功能):可以作为反向代理的服务器,将客户端的请求转发给后端多个服务器,可以实现负载均衡,高可用。提高整个机器的性能以及可靠性。
正向代理(了解即可)
特点:已知后端服务器,请求只会往固定的服务器发送请求(保证用户一定程度上的隐私安全)
例:访问web服务器通过代理vpn的地址来进行访问
反向代理
反向代理的核心功能:客户端在请求时,通过代理服务器,会把请求的流量安装轮询算法转发到后台不同的服务器,实现负载均衡和高可用。
3、处理动态内容,nginx处理动态内容的能力很差,需要通过php node.js java python这些能够处理动态服务的应用才配合它来进行处理,nginx可以代理请求,发送到后端的动态服务处理,动态服务器处理之后,nginx来把动态请求,响应给客户端。
4、SSL/TLS加密,HTTPS的加密方式,数字证书验证机制。
5、虚拟主机:nginx可以在一台服务器上设置多个虚拟主机,同一个服务器上可以有多个域名和站点。
6、URL重定向。可以实现灵活的url重写和重定向。
7、缓存功能,nginx自带缓存功能。
3个重要的核心功能,必须掌握
缓存示例:
get web服务器上的内容 html页面 获取到了之后
从web服务器到nginx nginx最终再把内容响应给用户
在这个过程中web的内容就会被nginx保存到本地,下一次再请求就不用再到服务器上请求,加快了访问速度
(就是第一次访问之后,把内容保存到了本地,这既是缓存)
8、日志功能,可以详细的记录请求的信息,包括访问时间,请求路径,ip地址,响应状态,有助于故障排查。(系统控制的日志,记录在/var/log/messages. 业务日志:access.log error.log
access记录的谁访问我了,都是访问成功的记录。
error日志:也记录谁访问了我,但是记录的是访问失败的记录。)
nginx的主要应用场景
1、静态服务
2、反向代理、负载均衡
3、缓存服务
4、动态服务
nginx是如何实现高并发的?(面试题)
1、nginx自身代码的问题,通过大量的底层代码进行了优化,同时自带了一个功能模块。epoll模块,支持高并发
2、nginx也是一个master进程控制多个worker进程。master负责收集和分发请求,worker是实际执行者。每一个请求进来时,master就会拉起一个worker进程处理请求。同时master进程也负责监控worker的状态,worker的数量和cpu要一致,或者是cpu的两倍。
worker在处理请求的过程中,只受内存大小的限制。所以可以处理多个请求,再加上nginx本身就是轻量级的服务,处理请求时占用的内存本身就很少,所以可以起到并发处理的能力。
二者之间相互依赖,相互补充。
安装依赖环境
gcc环境
同样创建用户组
useradd -M -s /sbin/nologin nginx
解包之后编译安装一下
cd /opt/
tar -xf nginx
cd nginx-1.22.0/
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
--prefix=/usr/local/nginx 指定了Nginx的安装目录。在这种情况下,它将安装在 /usr/local/nginx 目录下。
--user=nginx 和 --group=nginx 指定了运行Nginx进程的用户和组。在这种情况下,它将是用户和组 nginx。
--with-http_ssl_module 启用了对HTTP连接的SSL/TLS加密支持。(http协议的加密模块)
--with-http_v2_module 启用了对HTTP2.0协议的支持。
--with-http_realip_module 允许Nginx从X-Real-IP或X-Forwarded-For头部获取客户端的真实IP地址。
--with-http_stub_status_module 启用了 stub_status 模块,提供了访问Nginx状态信息的方法。
--with-http_gzip_static_module 启用了支持使用 .gz 扩展名提供预压缩文件的功能。
--with-pcre 启用了对Perl Compatible Regular Expressions(PCRE)库的支持。
--with-stream 启用了对TCP/UDP代理模块的支持。
--with-stream_ssl_module 启用了对TCP/UDP连接的SSL/TLS加密支持。
--with-stream_realip_module 允许Nginx从PROXY协议头部获取客户端的真实IP地址。
make -j 4 && make install
chown -R nginx.nginx /usr/local/nginx #修改属主和属组
安装好后生成四个文件功能如下
1. conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,
其他的.conf则是用来配置nginx相关的功能的.
例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,
配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。
2. html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,
另外还有一个50x的web文件是默认的错误页面提示页面。
50x.html是nginx默认的错误页面的提示。
3. logs:用来保存nginx服务器的访问日志错误日志等日志,
logs目录可以放在其他路径,比如/var/logs/nginx里面。
4. sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ #让系统识别nginx的操作命令
nginx常用的服务
nginx -t 检查配置文件是否正确。
nginx -v 查看nginx的版本号(用的较多)
nginx -s 向主进程传输信号 停止,开启,重启,加载
nginx -c 设置配置文件的默认控制
添加Nginx系统服务
vim /lib/systemd/system/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=/usr/local/nginx/run/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
[Unit] 部分描述了单元的用途,以及文档的位置。
它还规定了在 Nginx 启动前需要启动的服务的依赖关系和顺序。
[Service] 部分包含了 Nginx 服务的配置,包括服务类型(在这种情况下是 forking)、PID 文件的位置
以及启动、重新加载和停止服务的命令。
最后,[Install] 部分指定了服务安装的目标。
ExecReload=/bin/kill -s HUP $MAINPID #相当与restart
ExecStop=/bin/kill -s TERM $MAINPID #相当与stop
因为指定了pidfile的位置,所以要创建一个run的目录
vim /usr/local/nginx/conf/nginx.conf
#修改配置文件
修改之前先把配置文件做一个备份
pid /usr/local/nginx/run/nginx.pid;
#因为指定了pid号,所以pid的位置要修改
systemctl daemon-reload
#重新加载配置
systemctl restart nginx 重启服务
这是nginx就已经装完了,测试一下
如果不添加到系统服务当中,就通过nginx -s的方式
nginx -s stop
nginx -s start
nginx -s reload
-s 参数只能用来发送信号给Nginx主进程,不能开启nginx服务
工作当中一般都会添加到系统服务当中,通过systemctl来控制
信号符:
信号符结合kill命令(传递信号):
kill -USR1 pid号(nginx服务的pid号) 日志分割(日志分割很重要)
kill -s HUP pid号 重新加载
注:只要用kill,后面只能跟pid号
killall -s HUP nginx 可以跟服务名,也可以用pid号
kill -s QUIT pid号 优雅退出,有人访问时不会结束进程,访问完了,才会结束进程。
kill -s WINCH pid号 优雅的结束worker,直到请求完成,才会介绍worker进程
yum安装nginx,必须要epql源(在线源)
yum install -y epel-release
yum install nginx -y
nginx的主配值文件详解(很重要,面试会问,工作当中常用)
主配置文件指的就是 nginx.conf
全局配置
全局配置,对所有服务,模块都生效
#user nobody; #运行用户,若编译时未指定则默认为nobody
worker_processes 1; #工作进程数量,一般配置成cpu数一致,或者2倍,如果网站访问量不大,一般来说小网站设为1就够用了
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID文件的位置
events块
events {
use epoll; #使用epoll模型, 2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 1024; #每个进程可以处理的最大连接数,默认为1024
}
#如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)
#可使用"ulimit -a"命令查看系统允许当前用户进程打开的文件数限制。
如何修改linux服务器文件的最大打开数量(很重要,面试题,工作中常用)
ulimit -n 65535 临时修改,linux只支持打开65535个文件
永久修改:
vim /etc/security/limits.conf
注:65535 为Linux系统最大打开文件数
* soft nproc 65535: 最大进程数软限制为 65535,即可以使用 ulimit -u 命令查看和修改的值。
* hard nproc 65535: 最大进程数硬限制为 65535,即最大可分配的进程数。
* soft nofile 65535:最大打开文件数软限制为 65535,即可以使用 ulimit -n 命令查看和修改的值。
* hard nofile 65535:最大打开文件数硬限制为 65535,即最大可分配的文件数。
这里使用的通配符 * 表示对所有用户生效。
改完必须reboot重启之后才生效
这时候再看,就更改成功了
events配置只影响nginx服务器与用户之间的网络连接。
http配置(重点模块)
主要是针对http请求的配置,代理,缓存,日志,反向处理,虚拟web主机,server块。
非http请求的方式,不能写在该模块当中。因为反向代理分七层, 四层代理不能写在http的模块当中,因为它不属于http请求。
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type appkgcation/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;(65秒)
#gzip模块设置,设置是否开启gzip压缩输出,取消注释就是打开页面压缩功能
gzip on;
http当中的server模块
配置虚拟主机的相关参数,一个http模块当中可以有多个server块。
server {
#监听地址及端口
listen 80;
#主机名,网址名,站点域名,可以有多个,用空格隔开
server name www.kgc.com;
#网页的默认字符集
charset utf-8;
server模块当中的location块
location块匹配的是URI
例:https://www.baidu,com/images/search URI是images/search
#根目录配置
location / {
网站根目录的位置/usr/local/nginx/html
root html;
#内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
#错误页面配置
location = /50x.html {
root html;
}
}
}
location /代表的路径就是usr/local/nginx/html
这个时候能够请求到,使用root做的是拼接
看一下日志:
alias /opt/加了/变成了opt//,这是一个特殊的机制
我们去掉/再看一下
看一下报错的日志,变成了opt目录下面
测试一下:
总结:
location模块当中
root 拼接,root指定的目录和location匹配的uri之间做的一个拼接,/opt/ky30/ 这两个路径都必须真实存在,而且都是目录,并且,在uri目录里面要有