Nginx 学习笔记

什么是 Nginx?

Nginx (engine x) 是一个高性能的 HTTP 和反向代理 Web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有 12.18% 的使用比率,大约为 2220 万个网站。

Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持 perl 语法)、Bug 非常少的服务。Nginx 启动特别容易,并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。

Nginx 代码完全用 C 语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。

Nginx 作用?

Http 代理,反向代理:作为 Web 服务器最常用的功能之一,尤其是反向代理。

  • 正向代理

    img

  • 反向代理

    img

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。

动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js 等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。

Nginx 的安装

Windows 下安装

1、下载 Nginx

http://nginx.org/en/download.html 下载稳定版本。

以 nginx/Windows-1.16.1 为例,直接下载 nginx-1.16.1.zip。下载后解压,解压后如下:

img

2、启动 Nginx

有很多种方法启动 Nginx

(1) 直接双击 Nginx.exe,双击后一个黑色的弹窗一闪而过

(2) 打开 cmd 命令窗口,切换到 Nginx 解压目录下,输入命令 nginx.exe ,回车即可

3、检查 Nginx 是否启动成功

直接在浏览器地址栏输入网址 http://localhost:80 回车,出现以下页面说明启动成功!

img

4、配置监听

Nginx 的配置文件是 conf 目录下的 Nginx.conf,默认配置的 Nginx 监听的端口为 80,如果 80 端口被占用可以修改为未被占用的端口即可。

img

当我们修改了 Nginx 的配置文件 Nginx.conf 时,不需要关闭 Nginx 后重新启动 Nginx,只需要执行命令 nginx -s reload 即可让改动生效

5、关闭 Nginx

如果使用 cmd 命令窗口启动 Nginx, 关闭 cmd 窗口是不能结束 Nginx 进程的,可使用两种方法关闭 Nginx

(1) 输入 Nginx 命令 nginx -s stop (快速停止 Nginx) 或 nginx -s quit (完整有序的停止 Nginx)

(2) 使用 taskkill taskkill /f /t /im nginx.exe

taskkill 是用来终止进程的,/f 是强制终止 ./t 终止指定的进程和任何由此启动的子进程。/im 表示指定的进程名称 .

Linux 下安装

1、安装 gcc

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

yum install gcc-c++

2、PCRE pcre-devel 安装

PCRE (Perl Compatible Regular Expressions) 是一个 Perl 库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx 也需要此库。命令:

yum install -y pcre pcre-devel

3、zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

4、OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 CentOS 安装 OpenSSL 库。

yum install -y openssl openssl-devel

5、下载安装包

手动下载.tar.gz安装包,地址:https://nginx.org/en/download.html

img

下载完毕上传到服务器上 /root。

6、解压

tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0

img

7、配置

使用默认配置,在nginx根目录下执行

./configure
make
make install

查找安装路径: whereis nginx

img

Nginx 常用命令

cd /usr/local/nginx/sbin/
./nginx  # 启动
./nginx -c /{特定目录}/nginx.conf  # 以特定目录下的配置文件启动
./nginx -s stop  # 停止
./nginx -s quit  # 安全退出,nginx 在完成当前工作任务后再停止。
./nginx -s reload  # 重新加载配置文件
ps aux|grep nginx  # 查看 nginx 进程
./nginx -t  # 检查配置文件是否正确
./nginx -t -c /{特定目录}/nginx.conf  # 检查特定目录的配置文件是否正确
./nginx -v  # 查看版本信息

启动成功访问 {服务器 IP}:80

img

注意:如果连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口!

相关命令:

# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
# 重启防火墙 (修改配置后要重启防火墙)
firewall-cmd --reload

# 参数解释
# 1. firwall-cmd:是 Linux 提供的操作 firewall 的一个工具;
# 2. --permanent:表示设置为持久;
# 3. --add-port:标识添加的端口;

配置文件

main
events { ... }
http {
  server {
    location  { ... }
  }
}

Nginx 默认的配置文件主要有 main、events、http、server、location 五个块组成。其中 http 、server、location 属于嵌套关系。

  • main:主要控制Nginx子进程所属的用户和用户组、派生子进程数、错误日志位置与级别、pid位置、子进程优先级、进程对应cpu、进程能够打开的文件描述符数目等。
  • events:控制Nginx处理连接的方式。
  • http:Nginx处理http请求的主要配置块。
  • server:Nginx中主机配置块,可用于配置多个虚拟主机。
  • location:server中对应目录级别的控制块,可以有多个。
# 运行用户
user nobody;
# 工作进程数
worker_processes  1;
# 全局错误日志及PID文件
# error_log  logs/error.log;
# error_log  logs/error.log  notice;
# error_log  logs/error.log  info;
# pid        logs/nginx.pid;
# 工作模式及连接数上限
events {
  # epoll是多路复用IO(I/O Multiplexing)中的一种方式,
  # 仅用于linux2.6以上内核,可以大大提高nginx的性能
  use   epoll; 
  # 单个后台worker process进程的最大并发链接数    
  worker_connections  1024;
}
http {
  # 设定mime类型,类型由mime.type文件定义
  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"';
  access_log  logs/access.log  main;
  # sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
  # 对于普通应用,必须设为 on,
  # 如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
  # 以平衡磁盘与网络I/O处理速度,降低系统的uptime.
  sendfile     on;
  # tcp_nopush     on;
  # 连接超时时间
  # keepalive_timeout  0;
  keepalive_timeout  65;
  tcp_nodelay     on;
  # 开启gzip压缩
  gzip  on;
  gzip_disable "MSIE [1-6].";
  # 设定请求缓冲
  client_header_buffer_size    128k;
  large_client_header_buffers  4 128k;
  # 设定虚拟主机配置
  server {
    # 侦听80端口
    listen    80;
    # 定义使用 www.nginx.cn访问
    server_name  www.nginx.cn;
    # 定义服务器的默认网站根目录位置
    root html;
    # 设定本虚拟主机的访问日志
    access_log  logs/nginx.access.log  main;
    # 默认请求
    location / {
      # 定义首页索引文件的名称
      index index.php index.html index.htm;   
    }
    # 定义错误提示页面
    error_page   500 502 503 504 /50x.html;
    location = /50x.html {
    }
    # 静态文件,nginx自己处理
    location ~ ^/(images|javascript|js|css|flash|media|static)/ {
      # 过期30天,静态文件不怎么更新,过期可以设大一点,
      # 如果频繁更新,则可以设置得小一点。
      expires 30d;
    }
    # PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
    location ~ .php$ {
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include fastcgi_params;
    }
    # 禁止访问 .htxxx 文件
    location ~ /.ht {
      deny all;
    }
  }
}

其中 location 根据不同前缀的使用方式,大致分为普通 location 和正则 location。多个正则 location 之间会按照先后顺序进行匹配,匹配成功后,就不会继续匹配后面定义的 location。多个普通 location 之间遵循“最大匹配原则”,匹配度最高的 location 将会被执行,同时也可以利用 = 精准匹配和 ^~ 非正则匹配可以在正则匹配之前优先匹配,禁止执行原有的正则匹配。

因此 当多种类型的 location 匹配同时出现时,最终执行结果为 = 匹配优先于 ^~ 匹配,^~ 匹配优先于正则匹配,正则匹配优先于普通的最大前缀匹配 只要优先的 location 匹配成功,就不会执行其他的 location。


Nginx 学习笔记
http://lpxz.work/posts/38013/
作者
LPxz
发布于
2021年12月29日
许可协议