Nginx学习笔记-基础篇


  • 1. nginx优势
  • 1.1 nginx实现了IO流多路复用
  • 1.1.1 select
  • 1.1.2 poll
  • 1.1.3 epoll
  • 1.2 nginx是轻量级的
  • 1.3 nginx和CPU亲和
  • 1.4 sendfile
  • 2. 快速安装
  • 3. Nginx基本参数配置
  • 3.1 安装目录
  • 3.2 Nginx的配置参数说明
  • 4 Nginx简单配置demo
  • 4.1 配置主页

1. nginx优势

1.1 nginx实现了IO流多路复用

多个描述符的I/O都能够在一个线程内交替并发地顺序完成,这个“复用”实际上是对同一个线程的复用,这个就是I/O多路复用。


应用 内核 Block Read请求可用 初始化I/O数据拷贝 Read完成 应用 内核


I/O多路复用实现,在linux上的实现方式主要包括:select,epoll

1.1.1 select

select会不断的依次的循环Block队列中的内容,效率低下,而且对文件描述符会有限制

  • 能够监视文件描述符的数量存在最大限制,只有1024个【相关链接】
  • 线性扫描效率低下
1.1.2 poll

本质上和select没有区别,只是没有了最大连接数的限制

1.1.3 epoll
  • 当每一个FD(文件描述符)就绪的时候,采用系统回调函数之间,将FD放入,效率更高
  • 没有最大连接数限制
1.2 nginx是轻量级的
  • 功能模块化
  • 代码模块化

1.3 nginx和CPU亲和

nginx使用worker对CPU进行绑定,是一种把CPU核心和Nginx工作进程绑定方式,把每个worker进程固定在一个CPU上执行,减少切换CPU的cache miss,获得更好的性能

1.4 sendfile

当我们请求一个文件的时候,在内核工作的时候:内核空间->用户空间->socket给client
但是在nginx里面,由于静态文件不需要经过用户空间进行逻辑处理,所以是直接:内核空间->socket了


file Kernel space User space Socket Buffer cache Buffer cache Buffer cache (Nginx)Buffer cache 给客户端 file Kernel space User space Socket


2. 快速安装

确认环境:

  1. centos7.0以上
  2. 能够连接公网
  3. 能够使用yum,pip
  4. 关闭iptables和selinux

安装编译环境:

yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake

安装常用工具:

yum install -y wget httpd-tools vim

初始化自己的环境文件夹:

cd /<mydir> 
mkdir app download logs work backup
# app 代码目录
# download 下载的依赖
# logs 日志文件
# work 一些shell脚本
# backup 备份的配置文件

在nginx官方网站上找到centos的yum源

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

在centos上安装yum repo

  1. 需要在/etc/yum.repos.d/文件夹下新建一个yum repo文件nginx.repo,并且把上述的yum源配置上去
touch /etc/yum.repos.d/nginx.repo
vim /etc/yum.repos.d/nginx.repo  # 然后把上面的yum源粘贴上去

粘贴的yum源还需要改动os和版本,所以实际上应该粘贴的内容是,然后保存即可。

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

默认情况下,使用稳定nginx包的存储库。如果您想使用主线nginx包,请运行以下命令

sudo yum-config-manager --enable nginx-stable

然后就可以试试,使用yum list|grep nginx可以看到已经有nginx的安装内容

[root@centos8 ~]# yum list|grep nginx
Repository AppStream is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository PowerTools is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
nginx.x86_64                                         1:1.18.0-1.el8.ngx                                nginx-stable     
nginx-all-modules.noarch                             1:1.14.1-9.module_el8.0.0+184+e34fea82            AppStream        
nginx-debuginfo.x86_64                               1:1.18.0-1.el8.ngx                                nginx-stable     
nginx-filesystem.noarch                              1:1.14.1-9.module_el8.0.0+184+e34fea82            AppStream        
nginx-mod-http-image-filter.x86_64                   1:1.14.1-9.module_el8.0.0+184+e34fea82            AppStream        
nginx-mod-http-perl.x86_64                           1:1.14.1-9.module_el8.0.0+184+e34fea82            AppStream        
nginx-mod-http-xslt-filter.x86_64                    1:1.14.1-9.module_el8.0.0+184+e34fea82            AppStream        
nginx-mod-mail.x86_64                                1:1.14.1-9.module_el8.0.0+184+e34fea82            AppStream        
nginx-mod-stream.x86_64                              1:1.14.1-9.module_el8.0.0+184+e34fea82            AppStream        
nginx-module-image-filter.x86_64                     1:1.18.0-1.el8.ngx                                nginx-stable     
nginx-module-image-filter-debuginfo.x86_64           1:1.18.0-1.el8.ngx                                nginx-stable     
nginx-module-njs.x86_64                              1:1.18.0.0.4.3-1.el8.ngx                          nginx-stable     
nginx-module-njs-debuginfo.x86_64                    1:1.18.0.0.4.3-1.el8.ngx                          nginx-stable     
nginx-module-perl.x86_64                             1:1.18.0-1.el8.ngx                                nginx-stable     
nginx-module-perl-debuginfo.x86_64                   1:1.18.0-1.el8.ngx                                nginx-stable     
nginx-module-xslt.x86_64                             1:1.18.0-1.el8.ngx                                nginx-stable     
nginx-module-xslt-debuginfo.x86_64                   1:1.18.0-1.el8.ngx                                nginx-stable     
pcp-pmda-nginx.x86_64                                5.0.2-5.el8                                       AppStream  v

然后安装nginx

sudo yum install nginx

3. Nginx基本参数配置

3.1 安装目录

通过yum安装的都是rpm包,所以可以通过查看安装目录

rpm -ql nginx

可以得到以下结果

[root@centos8 ~]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/modules
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/.build-id
/usr/lib/.build-id/72
/usr/lib/.build-id/72/32b3d274d95e3739c1690a6344d3aac4c6272b
/usr/lib/.build-id/7f
/usr/lib/.build-id/7f/0259e101e7ab850dee7e6ac2907ac62f6f5917
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.18.0
/usr/share/doc/nginx-1.18.0/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx
/var/log/nginx
[root@centos8 ~]#

简单来看,主要分为三部分目录

  • /etc目录,主要是放一些核心额配置
  • /usr目录
  • /var目录

对于Nginx的安装目录,rpm包规范配置:

路径

类型

作用

/etc/logrotate.d/nginx

配置文件

Nginx日志轮转,用于logrotate服务的日志切割

/etc/nginx

/etc/nginx/nginx.conf

/etc/nginx/conf.d

/etc/nginx/conf.d/default.conf

目录、配置文件

Nginx主配置文件

/etc/nginx/fastcgi_params

/etc/nginx/scgi_params

/etc/nginx/uwsgi_params

配置文件

cgi配置相关,fastcgi配置

/etc/nginx/koi-utf

/etc/nginx/koi-win

/etc/nginx/win-utf

配置文件

编码转换映射转化文件

/etc/nginx/mime.types

配置文件

设置http协议的Content-Type与拓展名对应关系

/usr/lib/systemd/system/nginx-debug.service

/usr/lib/systemd/system/nginx.service

/etc/sysconfig/nginx

/etc/sysconfig/nginx-debug

配置文件

用于配置出系统守护进程管理器管理方式

/usr/lib64/nginx/modules

/etc/nginx/modules

目录

Nginx模块目录

/usr/sbin/nginx

/usr/sbin/nginx-debug

命令

Nginx服务的启动管理终端命令

/usr/share/doc/nginx-1.18.0

/usr/share/doc/nginx-1.18.0/COPYRIGHT

/usr/share/man/man8/nginx.8.gz

文件、目录

Nginx的手册和帮助文档

/var/cache/nginx

目录

Nginx缓存目录

/var/log/nginx

目录

Nginx的日志目录

3.2 Nginx的配置参数说明

终端输入

nginx -V  # 大写V

输出配置

[root@centos8 ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC) 
built with OpenSSL 1.1.1c FIPS  28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log  \
--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock \ 
--http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp \ 
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \ 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads \ 
--with-http_addition_module --with-http_auth_request_module --with-http_dav_module \
--with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module \ 
--with-http_mp4_module --with-http_random_index_module --with-http_realip_module \
--with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module \
--with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream \
--with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module \
--with-cc-opt='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC' \ 
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
[root@centos8 ~]#

从上面的配置,那些“–with”的,除了–with-cc-opt其他都不做说明

编译选项

说明

配置方式

–prefix=/etc/nginx

Nginx主目录

在安装编译的时候产生

–sbin-path=/usr/sbin/nginx

Nginx执行命令

在安装编译的时候产生

–modules-path=/usr/lib64/nginx/modules

Nginx模块目录

在安装编译的时候产生

–conf-path=/etc/nginx/nginx.conf

Nginx配置文件

在安装编译的时候产生

–error-log-path=/var/log/nginx/error.log

Nginx错误日志

在安装编译的时候产生

–http-log-path=/var/log/nginx/access.log

Nginx访问日志

在安装编译的时候产生

–pid-path=/var/run/nginx.pid

Nginx的pid文件,记录了这个Nginx服务启动的pid

在安装编译的时候产生

–lock-path=/var/run/nginx.lock

Nginx锁

在安装编译的时候产生

http-client-body-temp-path=/var/cache/nginx/client_temp

–http-proxy-temp-path=/var/cache/nginx/proxy_temp

–http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp

--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp

–http-scgi-temp-path=/var/cache/nginx/scgi_temp

缓存目录,执行对应模块的时候Nginx产生的临时保留文件

-

–user=ngin

–group=nginx

设定Nginx启动的用户和用户组,我们虽然使用root启动的Nginx但是实际上的Nginx的Worker是在nginx指定的用户上去跑的

-

–with-cc-opt

设置额外的参数将被添加到CFLAGS变量当中

-

–with-ld-opt

设置附加的参数,链接系统库

-

4 Nginx简单配置demo

4.1 配置主页

Nginx的配置文件主要是/etc/nginx/nginx.conf和/etc/nginx/conf.d/default.conf配置文件,当Nginx启动的时候会先加载nginx.conf,再加载default.conf中的配置。
在default.conf中配置的server选项中可以配置index.html页面,在location选项里面可以配置主页的路径和地址

server {
    listen       80;
    server_name  192.168.0.1;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /myproject/static;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root  /myproject/static;
    }
}

完成配置的更改后,可以使用systemctl启动nginx

systemctl start nginx

当nginx配置文件更改的时候,可以使用reload更新配置,也可以选择重启nginx

systemctl reload nginx
systemctl restart nginx

当然也有tc工具可以校验nginx配置文件正确性
命令:

nginx -tc nginx.conf

输出:

[root@centos8 nginx]# nginx -tc nginx.conf 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@centos8 nginx]#