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 协议 ,转载请注明出处!