web服务器介绍
Apache HTTP Server:也称为Apache,是一个开源的HTTP服务器,目前是全球使用最广泛的Web服务器
Nginx:Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
Microsoft Internet Information Services (IIS):IIS是由微软开发的一种Web服务器软件,用于在Windows操作系统上提供服务
Lighttpd:Lighttpd是一个开源的Web服务器,具有低内存占用和高并发处理能力
Node.js:Node.js本身并不是一个HTTP服务器,但它可以通过HTTP模块创建一个HTTP服务器,因此也可以用作HTTP服务程序
Tomcat:Tomcat是一个开源的Java Servlet容器,用于在Java平台上提供HTTP服务
Jetty:Jetty是一个开源的Java HTTP服务器和Servlet容器,具有高性能和低内存占用的特点
Caddy:Caddy是一个现代的,易于使用的HTTP/2服务器,具有自动HTTPS功能
apache
Apache(或httpd)服务,是Internet上使用最多的Web服务器技术之一,通俗来讲就是一个用于搭建网站的服务。
有两个版本:1.x和2.x
http:超文本传输协议,通过线路以明文形式发送,默认使用80端口/TCP
https:经TLS/SSL安全加密的超文本传输协议,默认使用443端口/TCP
Apache的配置文件
配置文件 存放位置
服务目录 /etc/httpd
主配置文件 /etc/httpd/conf/httpd.conf
虚拟主机的配置文件目录
配置文件 存放位置
服务目录 /etc/httpd
主配置文件 /etc/httpd/conf/httpd.conf
虚拟主机的配置文件目录 /etc/httpd/conf.d
基于用户的配置文件 /etc/httpd/conf.d/userdir.conf
日志文件目录 /etc/httpd/logs
默认的网站数据目录 /var/www/html
主配置文件的重要参数
主配置文件:/etc/httpd/conf/httpd.conf
参数 作用 参数 作用
serverRoot 服务目录 Servername 网站服务器的域名
Listen 监听的IP地址端口号 DocumentRoot 默认网站数据目录
User 运行服务的用户 Directory 文件目录权限
Group 运行服务的用户组 DirectoryIndex 默认的索引页面
Serveradmin 管理员邮箱 ErrorLog 错误日志文件
Apache prefork 模型
- 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
- 每个子进程有一个独立的线程响应用户请求
- 相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
- 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定缺点:每个用户请求需要对应开启一个进程,占用资源较多,并发性差,不适用于高并发场景
Apache worker 模型
- 一种多进程和多线程混合的模型
- 有一个控制进程,启动多个子进程
- 每个子进程里面包含固定的线程
- 使用线程程来处理请求
- 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
- 由于其使用了线程处理请求,因此可以承受更高的并发
优点:相比prefork 占用的内存较少,可以同时处理更多的请求缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在prefork模式下,同样会发生)
Apache event模型
- Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型,属于事件驱动模型(epoll)
- 每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
- 它和worker模式很像,最大的区别在于,它解决了keepalive场景下长期被占用的线程的资源浪费问题(某些线程因为被keepalive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)event MPM中,会有一个专门的线程来管理这些keepalive类型的线程
- 当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放缺点:没有线程安全控制
Nginx—高性能的web服务器
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提IMAP/POP3/SMTP服务。
Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。
Nginx支持热部署,启动简单,可以做到7*24不间断运行。几个月都不需要重新启动。
基于Nginx的工作场景:
nginx功能介绍
- 静态的web资源服务器html,图片,js,css,txt等静态资源
- http/https协议的反向代理
- 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
- tcp/udp协议的请求转发(反向代理)
- imap4/pop3协议的反向代理
nginx基础特性
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机更新配置文件,升级版本,更换日志文件
- 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
- event-driven,aio,mmap,sendfile
Web 服务相关的功能
- 虚拟主机(server)
- 支持 keep-alive 和管道连接(利用一个连接做多次请求)
- 访问日志(支持基于日志缓冲提高其性能)url rewirte
- 路径别名
- 基于IP及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无须中断客户的工作进程
Nginx 架构和进程
Nginx 进程结构
web请求处理机制
- 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
- 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。
主进程(master process)的功能:
- 对外接口:接收外部的操作(信号)
- 对内转发:根据外部的操作的不同,通过信号管理 Worker
- 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- 读取Nginx 配置文件并验证其有效性和正确性
- 建立、绑定和关闭socket连接
- 按照配置生成、管理和结束工作进程
- 接受外界指令,比如重启、升级及退出服务器等指令
- 不中断服务,实现平滑升级,重启服务并应用新的配置
- 开启日志文件,获取文件描述符
- 不中断服务,实现平滑升级,升级失败进行回滚处理
- 编译和处理perl脚本
工作进程(worker process)的功能:
- 所有 Worker 进程都是平等的
- 实际处理:网络请求,由 Worker 进程处理
- Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
- 增加上下文切换的损耗
- 接受处理客户的请求
- 将请求依次送入各个功能模块进行处理
- I/O调用,获取响应数据
- 与后端服务器通信,接收后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
- 接收主程序指令,比如重启、升级和退出等
Nginx 启动和 HTTP 连接建立
Nginx 启动时, Master 进程,加载配置文件Master 进程,初始化监听的 socketMaster 进程, fork 出多个 Worker 进程Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
nginx的源码编译
nginx官网:
https://nginx.org/en/download.html
我们使用1.24.0.版本的
[root@nginx ~]# ll
总用量 1096
drwxr-xr-x. 2 root root 6 8月 9 05:33 公共
drwxr-xr-x. 2 root root 6 8月 9 05:33 模板
drwxr-xr-x. 2 root root 6 8月 9 05:33 视频
drwxr-xr-x. 2 root root 6 8月 9 05:33 图片
drwxr-xr-x. 2 root root 6 8月 9 05:33 文档
drwxr-xr-x. 2 root root 6 8月 9 05:33 下载
drwxr-xr-x. 2 root root 6 8月 9 05:33 音乐
drwxr-xr-x. 2 root root 6 8月 9 05:33 桌面
-rw-------. 1 root root 1235 8月 9 05:26 anaconda-ks.cfg
-rw-r--r--. 1 root root 1112471 8月 15 07:21 nginx-1.24.0.tar.gz
-rw-r--r--. 1 root root 597 8月 9 05:44 vmset.sh
我们将nginx压缩包解压缩
[root@nginx ~]# tar -zxvf nginx-1.24.0.tar.gz
[root@nginx nginx-1.24.0]# ll
总用量 816
drwxr-xr-x. 6 1001 1001 4096 8月 15 07:22 auto
-rw-r--r--. 1 1001 1001 323312 4月 10 2023 CHANGES
-rw-r--r--. 1 1001 1001 494234 4月 10 2023 CHANGES.ru
drwxr-xr-x. 2 1001 1001 168 8月 15 07:22 conf
-rwxr-xr-x. 1 1001 1001 2611 4月 10 2023 configure
drwxr-xr-x. 4 1001 1001 72 8月 15 07:22 contrib
drwxr-xr-x. 2 1001 1001 40 8月 15 07:22 html
-rw-r--r--. 1 1001 1001 1397 4月 10 2023 LICENSE
drwxr-xr-x. 2 1001 1001 21 8月 15 07:22 man
-rw-r--r--. 1 1001 1001 49 4月 10 2023 README
drwxr-xr-x. 9 1001 1001 91 8月 15 07:22 src
创建名为nginx的用户和组
[root@nginx objs]# useradd -s /sbin/nologin -M nginx
[root@nginx objs]# id nginx
用户id=1001(nginx) 组id=1001(nginx) 组=1001(nginx)
# 不可以登陆
其中有个文件configure,他的作用是环境检测,检测我们当前环境安装nginx缺少那些依赖。
[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
# 指定我们的安装目录
--user=nginx \ # 指定nginx运行用户
--group=nginx \ # 指定nginx运行组
--with-http_ssl_module \ # 支持https://
--with-http_v2_module \ # 支持http版本2
--with-http_realip_module \ # 支持ip透传
--with-http_stub_status_module \ # 支持状态页面
--with-http_gzip_static_module \ # 支持压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持tcp反向代理
--with-stream_ssl_module \ # 支持tcp的ssl加密
--with-stream_realip_module # 支持tcp的透传ip
我们可以通过执行这个文件,并在其后通过加一些参数来指定我们的nginx需要的功能,但是增加的参数越多,需要的依赖就越多,可以通过--help来查看我们需要的参数
[root@nginx nginx-1.24.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
checking for OS
+ Linux 5.14.0-162.6.1.el9_1.x86_64 x86_64
checking for C compiler ... not found
./configure: error: C compiler cc is not found
根据报错信息可知,我们缺少了 C语言的编译器,yum安装即可:
[root@nginx nginx-1.24.0]# yum install gcc -y
安装完成后再次执行上一个命令
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
这次给的报错,发现少了一个PCRE,我们可以通过yum search 来找对应的包
[root@nginx nginx-1.24.0]# yum search PCRE
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:0:03:00 前,执行于 2024年08月15日 星期四 07时42分29秒。
============================= 名称 和 概况 匹配:PCRE =============================
pcre-cpp.i686 : C++ bindings for PCRE
pcre-cpp.x86_64 : C++ bindings for PCRE
pcre-devel.i686 : Development files for pcre
pcre-devel.x86_64 : Development files for pcre # 这就是pcre的开发包
pcre-utf16.i686 : UTF-16 variant of PCRE
pcre-utf16.x86_64 : UTF-16 variant of PCRE
pcre-utf32.i686 : UTF-32 variant of PCRE
pcre-utf32.x86_64 : UTF-32 variant of PCRE
pcre2-devel.i686 : Development files for pcre2
pcre2-devel.x86_64 : Development files for pcre2
pcre2-syntax.noarch : Documentation for PCRE2 regular expressions
pcre2-utf16.i686 : UTF-16 variant of PCRE2
pcre2-utf16.x86_64 : UTF-16 variant of PCRE2
pcre2-utf32.x86_64 : UTF-32 variant of PCRE2
pcre2-utf32.i686 : UTF-32 variant of PCRE2
postfix-pcre.x86_64 : Postfix PCRE map support
================================= 名称 匹配:PCRE =================================
pcre.x86_64 : Perl-compatible regular expression library
pcre.i686 : Perl-compatible regular expression library
pcre2.x86_64 : Perl-compatible regular expression library
pcre2.i686 : Perl-compatible regular expression library
找到后继续安装,然后执行上一条命令
[root@nginx nginx-1.24.0]# yum install pcre-devel.x86_64 -y
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.
这次的报错发现少了一个OpenSSL,我们继续找他对应的包
[root@nginx nginx-1.24.0]# yum search openssl
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:0:07:56 前,执行于 2024年08月15日 星期四 07时42分29秒。
===================================================================== 名称 精准匹配:openssl =====================================================================
openssl.x86_64 : Utilities from the general purpose cryptography library with TLS implementation
=================================================================== 名称 和 概况 匹配:openssl ===================================================================
apr-util-openssl.x86_64 : APR utility library OpenSSL crypto support
openssl-devel.i686 : Files for development of applications which will use OpenSSL
openssl-devel.x86_64 : Files for development of applications which will use OpenSSL
openssl-perl.x86_64 : Perl scripts provided with OpenSSL
openssl-pkcs11.x86_64 : A PKCS#11 engine for use with OpenSSL
openssl-pkcs11.i686 : A PKCS#11 engine for use with OpenSSL
perl-Crypt-OpenSSL-Bignum.x86_64 : Perl interface to OpenSSL for Bignum
perl-Crypt-OpenSSL-RSA.x86_64 : Perl interface to OpenSSL for RSA
perl-Crypt-OpenSSL-Random.x86_64 : OpenSSL/LibreSSL pseudo-random number generator access
rsyslog-openssl.x86_64 : TLS protocol support for rsyslog via OpenSSL library
xmlsec1-openssl.x86_64 : OpenSSL crypto plugin for XML Security Library
xmlsec1-openssl.i686 : OpenSSL crypto plugin for XML Security Library
======================================================================= 名称 匹配:openssl =======================================================================
compat-openssl11.i686 : Utilities from the general purpose cryptography library with TLS implementation
compat-openssl11.x86_64 : Utilities from the general purpose cryptography library with TLS implementation
openssl-libs.x86_64 : A general purpose cryptography library with TLS implementation
openssl-libs.i686 : A general purpose cryptography library with TLS implementation
======================================================================= 概况 匹配:openssl =======================================================================
perl-Net-SSLeay.x86_64 : Perl extension for using OpenSSL
qatengine.x86_64 : Intel QuickAssist Technology (QAT) OpenSSL Engine
然后安装对应的包openssl_devel.x86_64,我们的系统是x86_64的
[root@nginx nginx-1.24.0]# yum install openssl-devel.x86_64 -y
安装完成后,继续执行上一条命令
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.
根据报错发现少了个zlib,根据之前的经验,我们可以尝试安装zlib-devel 这个包
[root@nginx nginx-1.24.0]# yum install zlib-devel -y
然后继续执行上一条命令
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
到这,所有的依赖都安装完成,检测完成。
[root@nginx nginx-1.24.0]# ll
总用量 820
drwxr-xr-x. 6 1001 1001 4096 8月 15 07:22 auto
-rw-r--r--. 1 1001 1001 323312 4月 10 2023 CHANGES
-rw-r--r--. 1 1001 1001 494234 4月 10 2023 CHANGES.ru
drwxr-xr-x. 2 1001 1001 168 8月 15 07:22 conf
-rwxr-xr-x. 1 1001 1001 2611 4月 10 2023 configure
drwxr-xr-x. 4 1001 1001 72 8月 15 07:22 contrib
drwxr-xr-x. 2 1001 1001 40 8月 15 07:22 html
-rw-r--r--. 1 1001 1001 1397 4月 10 2023 LICENSE
-rw-r--r--. 1 root root 438 8月 15 07:54 Makefile
drwxr-xr-x. 2 1001 1001 21 8月 15 07:22 man
drwxr-xr-x. 3 root root 125 8月 15 07:54 objs
-rw-r--r--. 1 1001 1001 49 4月 10 2023 README
drwxr-xr-x. 9 1001 1001 91 8月 15 07:22 src
# 检测编译完成后objs里面生成的文件才是我们这个软件运行时所需要的
[root@nginx nginx-1.24.0]# make clean
通过make clean我们可以将我们之前检测的操作换原,换原成最初状态,对应的检测完成后新增的两个包也会消失
然后执行我们下面的命令,进行编译
[root@nginx nginx-1.24.0]# make && make install
make
:这部分命令用于编译源代码。make
命令会根据Makefile
文件中定义的规则来编译源代码,生成可执行文件或者库文件等。在这个过程中,会检查是否有必要重新编译文件(即源文件是否被修改过),然后仅编译那些被修改过的文件,以提高编译效率。如果一切顺利,make
命令执行完毕后,会在当前源代码目录下生成编译好的可执行文件或者库文件,但不会自动安装到系统的指定目录下。
make install
:在make
命令成功执行后,make install
命令才会被执行。这个命令会根据Makefile
中定义的安装规则,将编译好的文件安装到指定的目录,比如/usr/local/nginx
(这取决于Makefile
的配置)。这一步通常涉及复制文件到系统目录、设置权限等操作,以便系统可以正常使用这些文件。
[root@nginx nginx-1.24.0]# cd objs/
[root@nginx objs]# ll
总用量 5672
-rw-r--r--. 1 root root 17214 8月 15 07:54 autoconf.err
-rw-r--r--. 1 root root 52929 8月 15 07:54 Makefile
-rwxr-xr-x. 1 root root 5654232 8月 15 08:04 nginx
-rw-r--r--. 1 root root 5537 8月 15 08:04 nginx.8
-rw-r--r--. 1 root root 7990 8月 15 07:54 ngx_auto_config.h
-rw-r--r--. 1 root root 657 8月 15 07:54 ngx_auto_headers.h
-rw-r--r--. 1 root root 8758 8月 15 07:54 ngx_modules.c
-rw-r--r--. 1 root root 42928 8月 15 08:04 ngx_modules.o
drwxr-xr-x. 9 root root 91 8月 15 07:54 src
现在objs里面的文件就是我们的启动程序
此时我们可以通过自带的执行脚本启动nginx
[root@nginx ~]# cd /usr/local/nginx/sbin/
[root@nginx sbin]# ll
总用量 5524
-rwxr-xr-x. 1 root root 5654232 8月 15 08:04 nginx
[root@nginx sbin]# ./nginx
我们可以通过ps查看nginx是否启动
[root@nginx sbin]# ps aux | grep nginx
root 14829 0.0 0.0 9832 932 ? Ss 08:10 0:00 nginx: master process ./nginx
nginx 14830 0.0 0.2 13720 5388 ? S 08:10 0:00 nginx: worker process
root 14833 0.0 0.1 221680 2376 pts/1 S+ 08:11 0:00 grep --color=auto nginx
nginx默认两个进程,一个master管理进程和worker工作进程
查看端口
[root@nginx sbin]# netstat -antlupe | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 47399 14829/nginx: master
[root@nginx sbin]# ss -ltn | grep :80
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
[root@nginx sbin]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 14829 root 6u IPv4 47399 0t0 TCP *:http (LISTEN)
nginx 14830 nginx 6u IPv4 47399 0t0 TCP *:http (LISTEN)
以上三种方式都可以使用
因为此时开启了debug模式,使用编译完成后的文件比较大
[root@nginx sbin]# du -sh nginx
5.4M nginx
我们可以关掉debug模式,重新编译
[root@nginx sbin]# ./nginx -s stop
# 先关闭nginx
[root@nginx sbin]# rm -rf /usr/local/nginx/
# 删除nginx文件
[root@nginx nginx-1.24.0]# make clean
rm -rf Makefile objs
# 回到检测之前的状态
[root@nginx nginx-1.24.0]# ll
总用量 816
drwxr-xr-x. 6 nginx nginx 4096 8月 15 07:22 auto
-rw-r--r--. 1 nginx nginx 323312 4月 10 2023 CHANGES
-rw-r--r--. 1 nginx nginx 494234 4月 10 2023 CHANGES.ru
drwxr-xr-x. 2 nginx nginx 168 8月 15 07:22 conf
-rwxr-xr-x. 1 nginx nginx 2611 4月 10 2023 configure
drwxr-xr-x. 4 nginx nginx 72 8月 15 07:22 contrib
drwxr-xr-x. 2 nginx nginx 40 8月 15 07:22 html
-rw-r--r--. 1 nginx nginx 1397 4月 10 2023 LICENSE
drwxr-xr-x. 2 nginx nginx 21 8月 15 07:22 man
-rw-r--r--. 1 nginx nginx 49 4月 10 2023 README
drwxr-xr-x. 9 nginx nginx 91 8月 15 07:22 src
关闭nginx的debug模式
[root@nginx nginx-1.24.0]# vim auto/cc/gcc
# debug
# CFLAGS="$CFLAGS -g"
#通过vim文本编辑器锁定debug,将这个参数禁止掉
然后再执行之前的检测操作,最后我们再查看编译后的大小
[root@nginx sbin]# du -sh nginx
1.2M nginx
[root@nginx sbin]# pwd
/usr/local/nginx/sbin
#关闭了debug模式后,明显变小
为了启动nginx的时候不写那么一长串,我们可以通过增加参数达到效果
[root@nginx ~]# vim ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export PATH=$PATH:/usr/local/nginx/sbin
#在最后一行增加
[root@nginx ~]# source ~/.bash_profile
#重新加载并执行当前用户主目录下的.bash_profile文件中的命令和设置。
现在只需要一个nginx就可以启动
[root@nginx ~]# nginx
[root@nginx ~]# netstat -antlupe | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 54991 18045/nginx: master
nginx的配置目录
[root@nginx conf]# pwd
/usr/local/nginx/conf
配置文件
[root@nginx conf]# vim nginx.conf
查看版本
[root@nginx ~]# nginx -v
nginx version: nginx/1.24.0
nginx命令参数
[root@Nginx ~]# nginx -v
nginx version: nginx/1.26.1
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit #显示版本和编译参数
-t : test configuration and exit #测试配置文件是否异
-T : test configuration, dump it and exit #测试并打印
-q : suppress non-error messages during configuration testing #静默
模式
-s signal : send signal to a master process: stop, quit, reopen, reload #
发送信号,reload信号 会生成新的worker,但master不会重新生成
-p prefix : set prefix path (default: /etc/nginx/) #指定Nginx 目录
-c filename : set configuration file (default: /etc/nginx/nginx.conf) #
配置文件路径
-g directives : set global directives out of configuration file #设置全局指令,注意和
配置文件不要同时配置,否则冲突
nginx的平滑升级及版本回滚
平滑升级流程
- 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
- 向master进程发送USR2信号
- master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
- master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进程的PID存放至新生成的pid文件nginx.pid
- 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
- 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
- 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
实战
升级
我们先上传一个高版本的nginx软件包,我就要1.26.1版本
[root@nginx ~]# ll
总用量 2312
drwxr-xr-x. 2 root root 6 8月 9 05:33 公共
drwxr-xr-x. 2 root root 6 8月 9 05:33 模板
drwxr-xr-x. 2 root root 6 8月 9 05:33 视频
drwxr-xr-x. 2 root root 6 8月 9 05:33 图片
drwxr-xr-x. 2 root root 6 8月 9 05:33 文档
drwxr-xr-x. 2 root root 6 8月 9 05:33 下载
drwxr-xr-x. 2 root root 6 8月 9 05:33 音乐
drwxr-xr-x. 2 root root 6 8月 9 05:33 桌面
-rw-------. 1 root root 1235 8月 9 05:26 anaconda-ks.cfg
drwxr-xr-x. 9 nginx nginx 186 8月 15 08:27 nginx-1.24.0
-rw-r--r--. 1 root root 1112471 8月 15 07:21 nginx-1.24.0.tar.gz
-rw-r--r--. 1 root root 1244738 8月 15 08:47 nginx-1.26.1.tar.gz
进行解压缩,之后就是进行检测编译,但这次只需执行make,无需执行make install,因为老版本的nginx依然在工作
[root@nginx ~]# tar -zxvf nginx-1.26.1.tar.gz
[root@nginx ~]# cd nginx-1.26.1/
[root@nginx nginx-1.26.1]# ./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
[root@Nginx nginx-1.26.1]# make
此时我们就有了两个版本的nginx
[root@nginx nginx-1.26.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x. 1 root root 5727344 8月 15 08:51 objs/nginx
-rwxr-xr-x. 1 root root 1237312 8月 15 08:27 /usr/local/nginx/sbin/nginx
#一个是当前正在使用的,一个是编译好的
[root@nginx sbin]# ll
总用量 1212
-rwxr-xr-x. 1 root root 1237312 8月 15 08:27 nginx
[root@nginx sbin]# cp nginx nginx.24
[root@nginx sbin]# ll
总用量 2424
-rwxr-xr-x. 1 root root 1237312 8月 15 08:27 nginx
-rwxr-xr-x. 1 root root 1237312 8月 15 08:53 nginx.24
把新版本的复制过去,把之前的版本就覆盖了,然后使用nginx -t 进行检查
[root@nginx sbin]# \cp -f /root/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/
[root@nginx sbin]# ll
总用量 6808
-rwxr-xr-x. 1 root root 5727344 8月 15 08:55 nginx
-rwxr-xr-x. 1 root root 1237312 8月 15 08:53 nginx.24
[root@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
此时注意,在没有升级前我们的版本为1.24.0
[root@nginx sbin]# ps -aux | grep nginx
root 21245 0.0 0.1 9836 3620 ? Ss 09:10 0:00 nginx: master process nginx
nginx 21272 0.0 0.2 13724 5340 ? S 09:12 0:00 nginx: worker process
root 21385 0.0 0.1 221680 2312 pts/1 S+ 09:20 0:00 grep --color=auto nginx
[root@nginx sbin]# kill -USR2 21245
[root@nginx sbin]# ps -aux | grep nginx
root 21245 0.0 0.1 9836 3620 ? Ss 09:10 0:00 nginx: master process nginx
nginx 21272 0.0 0.2 13724 5340 ? S 09:12 0:00 nginx: worker process
root 21386 0.0 0.2 9836 5916 ? S 09:21 0:00 nginx: master process nginx
nginx 21387 0.0 0.2 13724 4756 ? S 09:21 0:00 nginx: worker process
root 21395 0.0 0.1 221680 2300 pts/1 S+ 09:21 0:00 grep --color=auto nginx
USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
此时两个 master 的进程都在运行 , 只是旧的 master 不在监听 , 由新的 master 监听 80此时 Nginx 开启一个新的 master 进程,这个 master 进程会生成新的 worker 进程,这就是升级后的 Nginx 进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
我们通过-WINCH 参数回收旧版本,新版本生效
[root@nginx sbin]# kill -WINCH 21245
# 将老版本的worker进程回收掉
[root@nginx sbin]# ps -aux | grep nginx
root 21245 0.0 0.1 9836 3620 ? Ss 09:10 0:00 nginx: master process nginx
root 21386 0.0 0.2 9836 5916 ? S 09:21 0:00 nginx: master process nginx
nginx 21387 0.0 0.2 13724 4756 ? S 09:21 0:00 nginx: worker process
root 21398 0.0 0.1 221680 2384 pts/1 S+ 09:22 0:00 grep --color=auto nginx
回滚
[root@nginx sbin]# cp nginx nginx.26
[root@nginx sbin]# ll
总用量 8020
-rwxr-xr-x. 1 root root 1237312 8月 15 09:20 nginx
-rwxr-xr-x. 1 root root 1237312 8月 15 09:25 nginx.24
-rwxr-xr-x. 1 root root 5727344 8月 15 09:11 nginx.26
[root@nginx sbin]# mv nginx.24 nginx
mv:是否覆盖'nginx'? y
[root@nginx sbin]# kill -HUP 21245 # 把老版本的worker激活
[root@nginx sbin]# ps aux | grep nginx
root 21245 0.0 0.1 9836 3620 ? Ss 09:10 0:00 nginx: master process nginx
root 21386 0.0 0.2 9836 5916 ? S 09:21 0:00 nginx: master process nginx
nginx 21387 0.0 0.2 13724 5184 ? S 09:21 0:00 nginx: worker process
nginx 21413 0.0 0.2 13724 4800 ? S 09:27 0:00 nginx: worker process
root 21417 0.0 0.1 221680 2292 pts/1 S+ 09:27 0:00 grep --color=auto nginx
[root@nginx sbin]# kill -WINCH 21386 # 回收新版本的worker
[root@nginx sbin]# ps aux | grep nginx
root 21245 0.0 0.1 9836 3620 ? Ss 09:10 0:00 nginx: master process nginx
root 21386 0.0 0.2 9836 5916 ? S 09:21 0:00 nginx: master process nginx
nginx 21413 0.0 0.2 13724 4800 ? S 09:27 0:00 nginx: worker process
root 21419 0.0 0.1 221680 2372 pts/1 S+ 09:27 0:00 grep --color=auto nginx
如果不行让别人访问时看到你的版本,我们可以通过在 这个目录里面修改配置文件
[root@nginx core]# pwd
/root/nginx-1.26.1/src/core
[root@nginx core]# ls
nginx.c ngx_crc32.h ngx_md5.c ngx_proxy_protocol.h ngx_shmtx.h
nginx.h ngx_crc.h ngx_md5.h ngx_queue.c ngx_slab.c
ngx_array.c ngx_crypt.c ngx_module.c ngx_queue.h ngx_slab.h
ngx_array.h ngx_crypt.h ngx_module.h ngx_radix_tree.c ngx_spinlock.c
ngx_bpf.c ngx_cycle.c ngx_murmurhash.c ngx_radix_tree.h ngx_string.c
ngx_bpf.h ngx_cycle.h ngx_murmurhash.h ngx_rbtree.c ngx_string.h
ngx_buf.c ngx_file.c ngx_open_file_cache.c ngx_rbtree.h ngx_syslog.c
ngx_buf.h ngx_file.h ngx_open_file_cache.h ngx_regex.c ngx_syslog.h
ngx_conf_file.c ngx_hash.c ngx_output_chain.c ngx_regex.h ngx_thread_pool.c
ngx_conf_file.h ngx_hash.h ngx_palloc.c ngx_resolver.c ngx_thread_pool.h
ngx_config.h ngx_inet.c ngx_palloc.h ngx_resolver.h ngx_times.c
ngx_connection.c ngx_inet.h ngx_parse.c ngx_rwlock.c ngx_times.h
ngx_connection.h ngx_list.c ngx_parse.h ngx_rwlock.h
ngx_core.h ngx_list.h ngx_parse_time.c ngx_sha1.c
ngx_cpuinfo.c ngx_log.c ngx_parse_time.h ngx_sha1.h
ngx_crc32.c ngx_log.h ngx_proxy_protocol.c ngx_shmtx.c
[root@nginx core]# vim nginx.h
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#ifndef _NGINX_H_INCLUDED_
#define _NGINX_H_INCLUDED_
#define nginx_version 1026001
#define NGINX_VERSION "1.0"
#define NGINX_VER "lf/" NGINX_VERSION
#ifdef NGX_BUILD
#define NGINX_VER_BUILD NGINX_VER " (" NGX_BUILD ")"
#else
#define NGINX_VER_BUILD NGINX_VER
#endif
#define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin"
#endif /* _NGINX_H_INCLUDED_ */
~
nginx启动文件编写
nginx默认情况下没有启动文件,所以我们需要手动编写
[root@nginx ~]# vim /lib/systemd/system/nginx.service
# 我们在这个文件中编写,system/后的文件可以随意起,为了规范一些我就起nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
# 这一部分是我们的环境
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid #pid位置
ExecStartPre=/usr/local/nginx/sbin/nginx -t # 执行nginx前看看配置文件有没有问题
ExecStart=/usr/local/nginx/sbin/nginx # 启动命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
# 这一部分是启动服务的主体
[Install]
WantedBy=multi-user.target
# 这个表示开启启动下在那个模式做
然后执行
[root@nginx ~]# systemctl daemon-reload
# 重新加载 systemd 管理器的配置
# 通常位于 /etc/systemd/system/ 或 /usr/lib/systemd/system/ 目录下),或者更新了 systemd 的软件包后,需要通知 systemd 重新加载这些配置文件,以确保新的配置生效
[root@nginx ~]# systemctl start nginx.service
我们先关闭之前开启的nginx服务,然后用我们的启动文件进行启动
[root@nginx ~]# nginx -s stop
[root@nginx ~]# ps aux | grep nginx
root 24148 0.0 0.1 221680 2472 pts/2 S+ 05:19 0:00 grep --color=auto nginx
[root@nginx ~]# systemctl start nginx.service
[root@nginx ~]# ps aux | grep nginx
root 24153 0.0 0.0 9848 972 ? Ss 05:20 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 24154 0.0 0.2 13656 4816 ? S 05:20 0:00 nginx: worker process
root 24156 0.0 0.1 221680 2408 pts/2 S+ 05:20 0:00 grep --color=auto nginx
nginx核心参数
配置文件说明
- 主配置文件:nginx.conf
- 子配置文件: include conf.d/*.conf
- fastcgi, uwsgi,scgi 等协议相关的配置文件
- mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
nginx 配置文件格式说明
配置文件由指令与指令块构成
每条指令以 ; 分号结尾,指令与值之间以空格符号分隔可以将多条指令放在同一行 , 用分号分隔即可 , 但可读性差 , 不推荐指令块以 { } 大括号将多条指令组织在一起 , 且可以嵌套指令块include 语句允许组合多个配置文件以提升可维护性使用 # 符号添加注释,提高可读性使用 $ 符号使用变量部分指令的参数支持正则表达式
Nginx 主配置文件的配置指令方式:
directive value [value2 ...];
注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义,格式: set variable_name value;
引用变量:$variable_name
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
默认的nginx.conf 配置文件格式说明
#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路
径,日志路径等。
user nginx nginx;
worker_processes 1; #启动工作进程数数量
events { #events #设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多
个网络连接,使用哪种事件驱动模型 #处理请求,每个工作进程可以同时支持的
最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器
的时候最大并发数为 #worker_connections *worker_processes,作为反向代理的时候为
(worker_connections * worker_processes)/2
}
http { #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格
式定义等绝大多数功能和第三方模块都 #可以在这设置,http块可
以包含多个server块,而一个server块中又可以包含多个location块,
#server块可以配置文件引入、MIME-Type定义、日志自定义、是
否启用sendfile、连接超时时间和 #单个链接的请求上限等。
include mime.types;
default_type application/octet-stream;
sendfile on; #作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用
#sendfile系统调用来传输文件
#sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作)
#从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称
之为零拷贝,
#硬盘 >> kernel buffer (快速拷贝到kernelsocket
buffer) >>协议栈。
keepalive_timeout 65; #长连接超时时间,单位是秒
server { #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块
#比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个
端口比如都使用 #80端口提供web服务
listen 80; #配置server监听的端口
server_name localhost; #本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。
location / { #location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指令
#都是在location中体现的,主要是基于nginx接受到的请求字符串
#对用户请求的UIL进行匹配,并对特定的指令进行处理
#包括地址重定向、数据缓存和应答控制等功能都是在这部分实现
#另外很多第三方模块的配置也是在location模块中配置。
root html; #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。
index index.html index.htm; #默认的页面文件名称
}
error_page 500 502 503 504 /50x.html; #错误页面的文件名称
location = /50x.html { #location处理对应的不同错误码的页面定义到/50x.html
#这个跟对应其server中定义的目录下。
root html; #定义默认页面所在的目录
}
}
#和邮件相关的配置
#mail {
# ...
# } mail 协议相关配置段
#tcp代理配置,1.9版本以上支持
#stream {
# ...
# } stream 服务器相关配置段
#导入其他路径的配置文件
#include /apps/nginx/conf.d/*.conf
}
全局配置
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
全局配置说明:
user nginx nginx; #启动Nginx工作进程的用户和组
worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进
程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,这就极大减少了nginx的工作进程在不同的
cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务
器的性能。
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:7号CPU
#示例
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU
worker_cpu_affinity 0101 1010;
#示例
worker_processes 4;
worker_cpu_affinity 00000010 00001000 00100000 10000000;
[root@centos8 ~]# ps axo pid,cmd,psr | grep nginx
31093 nginx: master process /apps 1
34474 nginx: worker process 1
34475 nginx: worker process 3
34476 nginx: worker process 5
34477 nginx: worker process 7
#错误日志记录配置,语法:error_log file [debug | info | notice | warn | error | crit
| alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /usr/local/nginx/logs/error.log error;
#pid文件保存路径
pid /usr/local/nginx/logs/nginx.pid;
worker_priority 0; #工作进程优先级,-20~20(19)
worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限,
#包括:Nginx的所有连接(例如与代理服务器的连接等)
#而不仅仅是与客户端的连接
#另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件
数的限制
#最好与ulimit -n 或者limits.conf的值保持一致,
#修改pam限制
[root@Nginx ~]# sudo -u nginx ulimit -n
1024
[root@Nginx ~]# vim /etc/security/limits.conf
* - nofile 100000
[root@Nginx ~]# sudo -u nginx ulimit -n
100000
daemon off; #前台运行Nginx服务用于测试、docker等环境。
master_process off|on; #是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为
on
events {
worker_connections 65535; #设置单个工作进程的最大并发连接数
use epoll; #使用epoll事件驱动,
#Nginx支持众多的事件驱动,
#比如:select、poll、epoll,只能设置在events模块中设置
accept_mutex on; #on为同一时刻一个请求轮流由work进程处理,
#而防止被同时唤醒所有worker
#避免多个睡眠进程被唤醒的设置,默认为off
#新请求会唤醒所有worker进程,此过程也称为"惊群"
#因此nginx刚安装完以后要进行适当的优化。建议设置为onmulti_accept on;
#on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接
#此指令默认为off,
#即默认为一个工作进程只能一次接受一个新的网络连接
#打开后几个同接受多个。建议设置为on
}
nginx全局参数优化
打开我们/usr/local/nginx/conf/nginx.conf下的文件,进行参数优化
user nginx; # 根据我们编译nginx时的用户进行修改,默认是nobady,且是不启用的
worker_processes auto; #启动Nginx工作进程的数量,一般设为和CPU核心数相同,auto为自动,也可以指定
worker_cpu_affinity 00000001 00000010; #将Nginx工作进程绑定到指定的CPU核心
修改完成后,这是没有进行配置文件更新的状态,此时我们只要一个worker进程
[root@nginx ~]# ps ax | grep nginx
24153 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx
24154 ? S 0:00 nginx: worker process
24256 pts/2 S+ 0:00 grep --color=auto nginx
当我们继续更新配置文件后,我们再看
[root@nginx ~]# nginx -s reload
[root@nginx ~]# ps ax | grep nginx
24153 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx
24263 ? S 0:00 nginx: worker process
24264 ? S 0:00 nginx: worker process
24266 pts/2 S+ 0:00 grep --color=auto nginx
由于我的电脑是双核,所以他就出了两个进程。
实现 nginx 的高并发配置
我们此时能支持的单个工作进程的最大并发连接数为1024,默认配置不支持高并发
[root@nginx ~]# ulimit -a
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7490
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
# 我们本机支持的最大打开数量也是1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7490
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
此时我们可以通过编辑/etc/security/limits.conf文件来修改打开的文件数量上限
此时我们通过sudo命令,超级用户可以使用任何身份进行访问,来查看我们nginx用户的最大文件打开数量
[root@nginx ~]# sudo -u nginx ulimit -n
10000
[root@nginx ~]# sudo -u nginx ulimit -a
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7490
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 10000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7490
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
此时我们就可以修改/usr/local/nginx/conf/nginx.conf文件下的参数,并且使用epoll模型
核心配置示例
基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现。
新建一个 PC web 站点
如果我们在原配置文件中进行增加,文件会变得非常长,不利于我们继续修改,查看,使用我们可以新增一个web 站点,将我们要写的内容全部放到新文件中,但是需要在源配置文件中指定新web站点的位置
指定子配置文件的位置,并且写在后面,否则不生效
没有的话我们可以新建这个子配置文件,在这个目录下创建文件,进行编写
[root@nginx ~]# mkdir -p /usr/local/nginx/conf.d/
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80; # 监听80端口
server_name www.haha.org; # 访问 www.haha.org 可以看到发布的东西
root /data/web/html; # 设置了请求的根目录
index index.html; # 指定了默认索引文件
}
~
创建目录
[root@nginx ~]# mkdir -p /data/web/html
[root@nginx ~]# echo www.haha.org > /data/web/html/index.html
配置完成后进行校验,刷新
[root@nginx ~]# 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
[root@nginx ~]# nginx -s reload
在测试之前可以把你的域名加到你的本地解析里面,就是你windows下system32里面drives里面etc下hosts文件
把域名和ip加进去,保存,要是不能保存就修改一下文件的属性,
测试:
root 与 alias
server {
listen 80; # 监听80端口
server_name www.haha.org; # 访问 www.haha.org 可以看到发布的东西
root /data/web/html; # 设置了请求的根目录 root+目录
index index.html; # 指定了默认索引文件
# 当server 和 location同时写了root,loaction会覆盖掉上面的路径
location /test1 {
root /data/web; # 当你访问test1时,你实际访问的是/data/web/te
# st1
}
}
# location中没有写索引文件时,默认使用server中的
[root@nginx ~]# mkdir /data/web/test1 -p
[root@nginx ~]# echo hello world > /data/web/test1/
[root@nginx ~]# echo hello world > /data/web/test1/index.html
[root@nginx ~]# 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
[root@nginx ~]# nginx -s reload
测试:
如果访问不到,也可以通过错误日志排查,
[root@nginx ~]# more /usr/local/nginx/logs/error.log
[root@nginx ~]# cat /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80; # 监听80端口
server_name www.haha.org; # 访问 www.haha.org 可以看到发布的东西
root /data/web/html; # 设置了请求的根目录 root+目录
index index.html; # 指定了默认索引文件
# 当server 和 location同时写了root,loaction会覆盖掉上面的路径
location /test1 {
root /data/web; # 当你访问test1时,你实际访问的是/data/web/te
# st1
}
location /test2 {
alias /data/web/test1; #写是真实的文件存在路径,不加location
}
}
测试·:相当于做了个软连接
root # 给定的路径对应于 location 中的 /uri 左侧的 /alias # 给定的路径对应于 location 中的 /uri 的完整路径
location 的详细使用
在一个 server 中 location 配置段可存在多个,用于实现从 uri 到文件系统的路径映射;ngnix 会根据用户请求的 URI 来检查定义的所有 location ,按一定的优先级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候, nginx 会先在 server 中的多个 location 选取匹配度最高的一个uriuri 是用户请求的字符串,即域名后面的 web 文件路径然后使用该 location 模块中的正则 url 和字符串,如果匹配成功就结束搜索,并使用此 location 处理此请求
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立
#即处理请求
^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
#对uri的最左边部分做匹配检查,不区分字符大小写
~ #用于标准uri前,表示包含正则表达式,并且区分大小写
~* #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号