cndaqiang Web Linux DFT

Nginx学习

2022-04-02
cndaqiang
web
RSS

Nginx学习,个人学习记录,只记录主要框架和用到的参数, 更详细的用法查manual即可。

参考

安装

编译openresty安装使用

下载源码

ROOT=$HOME/code/
cd $ROOT/source

#curl失败的,用wget
wget https://www.openssl.org/source/openssl-1.1.1b.tar.gz
wget https://mirrors.gigenet.com/OSDN//sfnet/p/pc/pcre/pcre/8.43/pcre-8.43.tar.gz
wget https://zlib.net/zlib-1.2.12.tar.gz  #官网可能因版本更新删除旧的下载链接

tar zxf openssl-*
tar zxf pcre-*
tar zxf zlib-*

wget https://openresty.org/download/openresty-1.19.9.1.tar.gz
tar zxf openresty-*
cd openresty-1.19.9.1/

编译

可以只提供上面下载的库的源代码即可

  --with-pcre=DIR                    set path to PCRE library sources
  --with-zlib=DIR                    set path to zlib library sources
  --with-libatomic=DIR               set path to libatomic_ops library sources
  --with-openssl=DIR                 set path to OpenSSL library sources

更多编译参数解释:nginx入门之—-编译安装

./configure \
  --with-openssl=../openssl-1.1.1b \
  --with-pcre=../pcre-8.43 \
  --with-zlib=../zlib-1.2.12 \
  --with-http_v2_module \
  --with-http_ssl_module \
  --with-pcre-jit \
  --prefix=$ROOT/softopenresty

make -j20
make install

echo PATH=$PATH:$ROOT/softopenresty >> ~/.bashrc
echo PATH=\$PATH:$ROOT/softopenresty/bin >> ~/.bashrc
echo PATH=\$PATH:$ROOT/softopenresty/nginx/sbin/ >> ~/.bashrc

目录展示

cndaqiang@mommint:~/code/softopenresty$ ls
bin  COPYRIGHT  luajit  lualib  nginx  pod  resty.index  site

nginx目录

cndaqiang@mommint:~/code/softopenresty$ tree nginx
nginx
├── conf #参考配置文件
│   ├── xxx.conf
efault
│   └── win-utf
├── html
│   ├── 50x.html
│   └── index.html
├── logs
└── sbin
    └── nginx

添加到系统服务

[root@localhost.com sbin]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
​
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload= /usr/local/nginx/sbin/nginx -s reload
ExecStop= /usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
​
[Install]
WantedBy=multi-user.target

使用

说明

  • nginx可以执行多次,每次执行都会在指定的目录(-p设定)创建所有的tmp文件和pid文件
  • 这种一个配置文件一个nginx,可以修改某个网站而不不用重启整个服务
  • 通过-p也可以对之前执行的nginx进行关闭重载等配置
  • 如果默认的配置文件不是conf/nginx.conf,stop,reload等操作时也必须-c指定这个文件
  • 默认-p的nginx运行的报错文件是logs/error.log,如果不存在logs目录会报错

nginx version: openresty/1.19.9.1 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix] [-e filename] [-c filename] [-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 停止更新一些站点
  • -p prefix : set prefix path (default: /home/cndaqiang/code//softopenresty/nginx/)
  • -e filename : set error log file (default: logs/error.log)
  • -c filename : set configuration file (default: conf/nginx.conf)
  • -g directives : set global directives out of configuration file

创建站点示例

cndaqiang@mommint:~$ cd ~/work/web/test
cndaqiang@mommint:~/work/web/test$ mkdir conf logs
cndaqiang@mommint:~/work/web/test$ cat > conf/nginx.conf <<EOF
worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    server {
        listen 2022;
        location / {
            default_type text/html;
            content_by_lua_block {
                ngx.say("<p>hello, world</p>")
            }
        }
    }
}
EOF

操作

  • 启动nginx,启动后会自动在后台运行了,退出当前账户,也仍在后台运行
    cndaqiang@mommint:~/work/web/test$ nginx -p $PWD
    
  • 浏览网页 http://127.0.0.1:2022/ 就有hello world
  • 关闭:(如果配置文件不是conf/nginx.conf,要-c指出来)
    cndaqiang@mommint:~/work/web/test$ nginx -s stop -p $PWD
    
  • 更新配置
    nginx -p $PWD -s reload
    

其他同理quit, reopen, reload

配置文件

  • 格式指令/参数;,必须包含换行符;,可以写在同一行用;号隔开不同指令. 或者用{}扩起来,}后不跟;,和c一样
  • 注释#开头
  • include file; 只能跟一个文件,或者类似正则表达include conf/*.conf
  • 不同模块的代码块内的参数名可能重复,因此填错参数位置,不会生效
  • 配置文件即一层层定义相应模块的不同功能main>event>..., main>http>...,如下示例. 具体模块的设置参数,查手册即可
  • 必须包含events{}模块,即使为空{}
  • 使用$符号使用变量,如$host,$remote_addr
  • 同一个参数可以出现在不同位置,手册里面会提到,如error_log可以在main, http, server, location等里面定义,如果在location里面定义了,location里面的执行日志就存到相应的文件,否则一直向上层寻找设置了error_log的目录.
  • rewrite_log的位置也只能出现可以有rewrite命令的位置

示例

#主模块等级
main        # 全局配置,对全局生效,如进程数量
├── events  # 配置影响 Nginx 服务器或与用户的网络连接
├── http    # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│   ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│   ├── server   # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│   ├── server
│   │   ├── location  # server 块可以包含多个 location 块,location 指令用于匹配 uri
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

主模块

worker_processes  1;          # 设置nginx启动进程的数量,一般设置成与逻辑cpu数量相同 
error_log  logs/error.log;    # 指定错误日志 
worker_rlimit_nofile 102400;  # 设置一个nginx进程能打开的最大文件数 
pid        /var/run/nginx.pid;  #默认prefix/log/nginx.pid
events{
      ...
}
http {
      ...
}

events

查手册

events {                      # 事件配置
    worker_connections  10240; # 设置一个进程的最大并发连接数
    use epoll;                # 事件驱动类型
}

http

# http 服务相关设置 
http {  
    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;      # 用于开启文件高效传输模式,一般设置为on,若nginx是用来进行磁盘IO负载应用时,可以设置为off,降低系统负载
    tcp_nopush        on;      # 减少网络报文段数量,当有数据时,先别着急发送, 确保数据包已经装满数据, 避免了网络拥塞
    tcp_nodelay       on;      # 提高I/O性能,确保数据尽快发送, 提高可数据传输效率                           
    gzip              on;      # 是否开启 gzip 压缩 
    keepalive_timeout  65;     # 设置长连接的超时时间,请求完成之后还要保持连接多久,不是请求时间多久,目的是保持长连接,减少创建连接过程给系统带来的性能损                                    耗,类似于线程池,数据库连接池
    types_hash_max_size 2048;  # 影响散列表的冲突率。types_hash_max_size 越大,就会消耗更多的内存,但散列key的冲突率会降低,检索速度就更快。                                            types_hash_max_size越小,消耗的内存就越小,但散列key的冲突率可能上升
    include             /etc/nginx/mime.types;  # 关联mime类型,关联资源的媒体类型(不同的媒体类型的打开方式)
    default_type        application/octet-stream;  # 根据文件的后缀来匹配相应的MIME类型,并写入Response header,导致浏览器播放文件而不是下载
# 虚拟服务器的相关设置 
    server { 
        listen      80;        # 设置监听的端口 
        server_name  localhost;        # 设置绑定的主机名、域名或ip地址 
        charset koi8-r;        # 设置编码字符 
        location / { 
            root  /var/www/nginx;           # 设置服务器默认网站的根目录位置 
            index  index.html index.htm;    # 设置默认打开的文档 
            } 
        error_page  500 502 503 504  /50x.html; # 设置错误信息返回页面 ,这里是把相应代码的错误界面直接替换成访问`http://url/50x.htmls`,即填入的是网页相对链接不是在服务器上的位置
            location = /50x.html { 
            root  html;        # 这里的绝对位置是/var/www/nginx/html 
        } 
    } 
 }

http/server/locations

用于定义网址中的含义,如下, 跟多的参数,网上有很多手册,这里就不搬运了

#访问路径为:www.cndaqiang.web/xxx 时, /xxx会按照这个规则进行匹配
        location / { 
            root  /var/www/nginx;           # 设置服务器默认网站的根目录位置 
            index  index.html index.htm;    # 设置默认打开的文档 
            }
#访问路径为:www.cndaqiang.web/hello 时, 则映射到`/home/cndaqiang/work/web/test/www/2.html`
location = /hello {
            alias /home/cndaqiang/work/web/test/www/2.html;
        }
#也可以 location = /xxx/ {};
#还有很多....
location  /i/ {
  alias  /spool/w3/images/;}

http/server/error_page

error_page  500 502 503 504  /50x.html; # 设置错误信息返回页面 ,这里是把相应代码的错误界面直接替换成访问`http://url/50x.htmls`,即填入的是网页相对链接不是在服务器上的位置
error_page 404  https://cndaqiang.github.io ; #直接跳到url

rewrite

位置server、location、if

rewrite 匹配规则 替换内容 [flag]

示例

应用

常用参数

error_log  logs/error.log;    # 指定错误日志,调试时注上level为debug
events{}
http {
    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;
}

反向代理

cndaqiang@mommint:~/work/web/test$ cat conf/nginx.conf
events{}
http {
    server {
        listen 2012;
        location / { proxy_pass https://cndaqiang.github.io/;  proxy_ssl_server_name on; }
    }
}

然后使用url/打开的链接就是https://cndaqiang.github.io的内容

代理有的网站时,出现502错误

二级目录反向代理

示例

server_name mom;
location /ip/ {
    proxy_ssl_server_name on;
    proxy_pass https://ip.cn/;
}

这样代理的网页虽然可以访问,但是有些网页元素如api/index?ip=&type=0,会对应mom/api/index?ip=&type=0,应该访问到ip.cn/api/...,因为没有做/api的地址映射,所以访问`mom/api/…‘只能返回404,可在错误日志中查到

2022/04/03 21:35:10 [error] 162970#0: *163 open() "/home/cndaqiang/work/web/test/html/api/index" failed (2: No such file or directory), client: 192.168.192.167, server: mom, request: "GET /api/index?ip=&type=0 HTTP/1.1", host: "mom:2012", referrer: "http://mom:2012/ip/"

为了解决这个问题,可以添加一个location

       location /api/ {
        proxy_ssl_server_name on;
        proxy_pass https://ip.cn/api/;
}

或者添加一个rewrite

      location /{
#这两种rewrite都行
#        rewrite '^/api/index' '/ip/api/index' last;
        rewrite '^/api/(.*)$' /ip/api/$1 last;
}

调试

设置日志输出

  • access_log:指的是访问日志,我们通过访问日志可以获取用户的 IP、请求处理的时间、浏览器信息等
  • error_log:错误日志记录了访问出错的信息,可以用于定位错误的原因

error_log

  • error_log可以在main,http, mail, stream, server, location里面定义,如果在location里面定义了,location里面的执行日志就存到相应的文件,否则一直向上层寻找设置了error_log的目录
error_log <FILE> <LEVEL>
  • error_log 设置输出的log文件
  • <LEVEL> 是日志的级别,常见的错误日志级别有[debug | info | notice | warn | error | crit | alert | emerg],级别越高记录的信息越少 debug输出的信息最多,不只是错误信息,还有rewrite等信息
  • error_log的位置可以有main, http, server, location
  • 是否输出特定功能的log还有设置,如rewrite的log: rewrite_log on;

access_log

  • access_log可以在http,server,location,limit_except里面使用 访问日志主要记录客户端的请求。客户端向Nginx服务器发起的每一次请求都记录在这里。客户端IP,浏览器信息,referer,请求处理时间,请求URL等都可以在访问日志中得到。当然具体要记录哪些信息,你可以通过log_format指令定义。

参数

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 设置访问日志
access_log off; # 关闭访问日志

http/access_log,自定义log规则为main示例

http{
    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;    #设置访问日志的位置和格式 
}

log示例

cndaqiang@mommint:~/work/web/test$ cat run.log
192.168.192.167 - - [02/Apr/2022:21:49:57 +0800] "GET /2.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36"
192.168.192.167 - - [02/Apr/2022:21:49:57 +0800] "GET /favicon.ico HTTP/1.1" 404 6 "http://mom:2012/2.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36"
192.168.192.167 - - [02/Apr/2022:21:49:58 +0800] "GET /favicon.ico HTTP/1.1" 404 6 "http://mom:2012/2.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36"

日志排查错误

当访问网页出现错误时,多查看日志

error_log  logs/error.log;    # 指定错误日志 

如反向代理一些网站时出现

2022/04/03 17:23:19 [error] 112816#0: *18 SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:SSL alert number 40) while SSL handshaking to upstream, client: 192.168.192.167, server: , request: "GET / HTTP/1.1", upstream: "https://172.67.204.11:443/", host: "mom:2012"

通过搜索引擎,得知解决方案是在location内添加proxy_ssl_server_name on;

其他笔记

web服务器

  • apache,最广最古老
  • Tomcat、Jetty: Java语言,jsp
  • IIS: windows系统下运行
  • nginx: 来自俄罗斯,性能好

本文首发于我的博客@cndaqiang.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!


目录

访客数据