简介
安装、启动及常用命令行指令
以windows系统为例,在官网下载对应的版本后,并解压到磁盘中:
- 可以直接点击nginx.exe启动
- 也可以在cmd切换到nginx目录下,执行
start nginx
其他常用命令:
nginx -s reload
服务重启,一般用于配置文件修改后,重新启动nginx服务nginx -s stop
直接停止服务nginx -s quit
平滑停止服务
配置文件nginx.conf
nginx.conf是nginx的主配置文件,采用类JSON的语法。
#全局块
worker_processes 1;
#event块
events {
worker_connections 1024;
}
#http块
http {
#http全局块
include mime.types;
keepalive_timeout 65;
#server块
server {
#server全局块
listen 8000;
server_name localhost;
#location块
location / {
root html;
index index.html index.htm;
}
}
}
****# 指定可以运行nginx服务的用户和用户组,只能在全局块配置
# user [user] [group]
# 将user指令注释掉,或者配置成nobody的话所有用户都可以运行
# user nobody nobody;
# user指令在Windows上不生效,如果你制定具体用户和用户组会报小面警告
# nginx: [warn] "user" is not supported, ignored in D:\software\nginx-1.18.0/conf/nginx.conf:2
# 指定工作线程数,可以制定具体的进程数,也可使用自动模式,这个指令只能在全局块配置
worker_processes number | auto;
# 列子:指定4个工作线程,这种情况下会生成一个master进程和4个worker进程
worker_processes 4;
# 指定pid文件存放的路径,这个指令只能在全局块配置
pid logs/nginx.pid;
# 指定错误日志的路径和日志级别,此指令可以在全局块、http块、server块以及location块中配置。(在全局会配置nginx全局的错误信息,在不同的server块下会单独记录该server的错误信息)
# 其中debug级别的日志需要编译时使用--with-debug开启debug开关
error_log [path] [debug | info | notice | warn | error | crit | alert | emerg]
error_log logs/error.log notice;
error_log logs/error.log info;
# 当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就有可能出现这样的问题。
# 开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢
# 默认是开启状态,只能在events块中进行配置
# accept_mutex on | off;
# 如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接。
# 如果nginx使用kqueue连接方法,那么这条指令会被忽略,因为这个方法会报告在等待被接受的新连接的数量。
# 默认是off状态,只能在event块配置
# multi_accept on | off;
# 指定使用哪种网络IO模型,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport,一般操作系统不是支持上面所有模型的。
# 只能在events块中进行配置
# use method
# use epoll
# 设置允许每一个worker process同时开启的最大连接数,当每个工作进程接受的连接数超过这个值时将不再接收连接
# 当所有的工作进程都接收满时,连接进入logback,logback满后连接被拒绝
# 只能在events块中进行配置
# 注意:这个值不能超过超过系统支持打开的最大文件数,也不能超过单个进程支持打开的最大文件数,具体可以参考这篇文章:https://cloud.tencent.com/developer/article/1114773
# worker_connections 1024;
````````- server 2 ...
常用的http块全局配置包括:
include mime.types; # 使用include引入其他的文件, 配置http Response 的 Content-Type
default_type application/octet-stream; # 配置默认类型,http Response 的 Content-Type
access_log path [format [buffer=size]] # 访问日志文件
sendfile on | off; # 传输时是否拷贝(直接把文件传输给客户端还是先在nginx应用程序内存中处理为2进制文件再传输)
keepalive_timeout 120s 120s; # 配置nginx支持长链接,它允许在单个TCP连接上发送多个HTTP请求和响应,而不需要为每个请求都建立和关闭一个独立的连接。
````<font style="color:rgb(89, 97, 114);">listen</font>
<font style="color:rgb(51, 51, 51);">server_name</font>
``_a.com__b.com_````
[](http://www.example.com/)
标准的location匹配类似这样:/abc
,这样请求地址前缀为http://域名/abc
的请求会被这个location块处理。
同时location还支持其他的语法来匹配来实现更复杂的需求:
location [ = | ~ | ~* | ^~ ] /URI { … }
location @/name/ { … }
****INFO
一些重要的配置指令
root、alias
root
和alias
的作用都是设置一个目录,他们的区别在于:
root
指定的是资源的根目录,Nginx会将客户端请求的URI附加到该目录的路径上。而alias
指定的目录会完全替换URI中的部分路径,然后使用剩余部分路径来定位文件。
我们来看一下示例:
location /i/ {
root /data/w3;
}
# 对于请求 /i/top.gif,Nginx会映射到/data/w3/i/top.gif。
location /images/ {
alias /var/www/image_files/;
}
# 对于请求/images/pic.jpg,Nginx会将它映射到 /var/www/image_files/pic.jpg。
index与try_files都涉及到
<font style="color:rgb(55, 65, 81);background-color:rgb(247, 247, 248);">index</font>
指令用于定义当URI指向一个目录时,NGINX 应该默认返回的文件。
index语法:<font style="color:rgb(55, 65, 81);background-color:rgb(247, 247, 248);">index file ...;</font>
可以指定一个或多个文件名,用空格分隔。NGINX 会按照指定的顺序逐个尝试这些文件,直到找到第一个存在的文件为止。
try_files:
**try_files**
指令用于指定在请求文件时如何进行文件查找和处理。通常用于处理 URL 重写、文件查找和错误处理的情况。
语法:try_files file ... uri;
其中,
示例用法:
server {
listen 80;
server_name example.com;
index index.html;
location /static/ {
alias /var/www/static_files/;
try_files $uri $uri/ =404;
}
}
当访问 http://example.com/static/image.jpg
时,查找过程如下:
- 请求 URI 为
/static/image.jpg
。 - alias 将
/static/
映射到/var/www/static_files/
,得到文件路径/var/www/static_files/image.jpg
。 - try_files 首先会尝试查找
/var/www/static_files/image.jpg
文件。 - 如果找不到,则尝试查找
/var/www/static_files/image.jpg/
目录(因为有 $uri/ 部分),并根据index配置,查找目录下index.html。 - 最后,如果仍然找不到匹配的文件,返回 404 错误。
反向代理
nginx一个常见的用途就是作为反向代理服务器,比如代理tomcat实例。
反向代理通常使用proxy_pass
指令配置:
比如如下的配置示例,会将localhost:80的访问代理为localhost:8080
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8080
}
}
负载均衡
反向代理的一个常见情形是结合负载均衡使用。
一个最简的配置如下,这份配置会将请求
其中upstream
块定义一组后端服务器,通过location
下的proxy_pass
将请求分发到这组后端服务器,实现负载均衡。
http{
upstream backend {
server localhost:8087 ;
server localhost:8088 ;
server localhost:8089;
}
server{
location / {
proxy_pass http://backend;
proxy_set_header Host $host; #设置原始主机头部
proxy_set_header X-Real-IP $remote_addr; # 设置客户端真实 IP 地址:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置客户端原始 X-Forwarded-For 头部:
}
}
}
负载均衡策略
nginx支持多种负载均衡策略。
- 轮询:
upstream backend {
server backend-server1;
server backend-server2;
server backend-server3;
}
upstream backend {
server backend-server1 weight=3;
server backend-server2 weight=2;
server backend-server3 weight=1;
}
- ****根据客户端IP地址进行散列,将同一个IP地址的请求始终分发到同一个后端服务器。适用于需要保持会话一致性的情况。
upstream backend {
ip_hash;
server backend-server1;
server backend-server2;
server backend-server3;
}
- ****将请求分发到当前连接数最少的后端服务器,以平衡连接负载。适用于处理连接数不均匀的场景。
upstream backend {
least_conn;
server backend-server1;
server backend-server2;
server backend-server3;
}
- 随机选择一个后端服务器分发请求。适用于负载较轻的情况。
upstream backend {
random;
server backend-server1;
server backend-server2;
server backend-server3;
}
- :根据后端服务器的响应时间分发请求,将请求分发到响应时间最短的服务器。适用于需要优化响应时间的情况。
upstream backend {
least_time;
server backend-server1;
server backend-server2;
server backend-server3;
}
keep-alive
keep-alive
,持久连接机制。可以在单个TCP连接上发送多个请求和响应,减少了为每个HTTP请求/响应对重复建立和终止连接的开销。
以下是保持活动连接机制的工作方式:
- 连接建立:当客户端(如Web浏览器)向服务器发送HTTP请求时,在请求中包含一个特殊的头部"
Connection: keep-alive
"。这告知服务器客户端支持持久连接。 - 响应传输:服务器处理请求并发送响应。在发送响应后,服务器不会立即关闭连接。相反,它会保持连接打开一段时间,允许在同一连接上发送附加请求。
- 后续请求:如果客户端想要发送更多请求,它可以通过现有的开放连接发送请求,而无需建立新连接。这减少了延迟并提高了性能,特别是当网页包含多个资源(如图像、样式表、脚本)需要单独的HTTP请求时。
- 连接超时:在一段不活动时间之后或者如果已达到最大请求数(根据配置),服务器可能会关闭连接。
Nginx 默认已经开启了keep-alive
,同时也有一些配置设置保持活动连接的配置。
比如下面这份配置,
http {
server {
listen 80;
server_name example.com;
keepalive_timeout 60s; # 最长保持连接的时间(在此示例中为60秒)
keepalive_requests 100; # 单个连接上的最大请求数(在此示例中为100个请求)
location / {
# 处理请求的其他配置指令
}
}
}
日志
Nginx可以记录访问日志和错误日志。
访问日志
访问日志记录了来自客户端的请求信息,包括请求的URL、响应状态、用户代理等。要设置访问日志,可以在 http 或 server 块中使用 access_log 指令。
INFO
语法: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
默认值: access_log logs/access.log combined;
例子: access_log /path/to/log.gz combined gzip flush=5m;
其中:
- path/var/log/nginx/access.log
- formatcombinedmainjsonlog_format
- buffer=size
- flush=time
- if=condition$status >= 400non-emptyif=$loggable
http {
# ...
server {
# ...
access_log /var/log/nginx/access.log;
# ...
}
}
错误日志
错误日志记录了服务器的错误和警告信息,设置错误日志,可以在 http 块中使用 error_log
指令。
error_log指令语法:error_log file [level]
****level(可选)指定日志记录的级别,包括:info
、debug
、notice
、warn
、error
......
为了节约服务器资源,生产环境下通常选择**error**
或**warn**
。
自定义格式
访问日志可以通过log_format
指令指定日志文件中的内容格式。
错误日志无法设置自定义格式
基本的示例如下,
http {
log_format custom '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
server {
}
}
在这个示例中,我们定义了一个名为 custom 的日志格式,记录了客户端IP、用户名、访问时间、请求、状态码、响应字节数、引用来源(Referer)和用户代理(User Agent)。
JSON格式
还可以将日志记录为JSON格式,便于后续的日志分析。
http {
log_format json '{ '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"time_local": "$time_local", '
'"request": "$request", '
'"status": $status, '
'"body_bytes_sent": $body_bytes_sent, '
'"http_referer": "$http_referer", '
'"http_user_agent": "$http_user_agent" '
'}';
server {
}
}
日志分割
nginx默认是不支持日志文件自动分割。我们可以通过**logorate**
工具来实现**。**
logrotate
是一个在类Unix系统中常用的工具,用于管理和维护日志文件。在 Windows 系统下,可以安装logrotatewin
使用方式:
- 在centos中是默认带有
**logorate**
工具的**,**在 Ubuntu 系统上,可以运行以下命令来安装 logrotate:
sudo apt-get install logrotate
- 创建 logrotate 配置文件: 在 /etc/logrotate.d/ 目录下创建一个新的文件,例如 nginx,用于配置 Nginx 日志的切割规则。
sudo nano /etc/logrotate.d/nginx
- 配置 logrotate: 在配置文件中,您可以指定日志文件、切割频率、保留的备份数量等。以下是一个示例配置,用于按天切割 Nginx 的访问日志文件:
/var/log/nginx/access.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
/usr/sbin/service nginx reload > /dev/null
endscript
}
- 保存并退出配置文件。
- 测试 logrotate 配置: 您可以手动运行 logrotate 来测试配置是否正确。
sudo logrotate -f /etc/logrotate.d/nginx
- 设置自动执行: logrotate 默认通过 cron 任务定期运行。可以编辑 /etc/cron.daily/logrotate 文件,确保 logrotate 在每天执行。不过,大多数系统已经默认配置了 cron 任务来运行 logrotate。
一些最佳实践
模块化配置
将不同的功能和配置信息分离到不同的文件中,然后通过include指令将它们引入主配置文件。这样可以使配置更易于维护和理解。
- 关闭不必要的模块,减少攻击面。
- 使用 server_tokens off; 来隐藏服务器版本信息。
- 使用 HTTPS 配置来加密通信。
- 配置适当的访问控制,限制谁可以访问NGINX服务器。
性能优化
- 配置适当的缓存策略,如 proxy_cache 或 fastcgi_cache。
- 启用 Gzip 压缩以减小传输数据的大小。
- 配置合理的连接和缓冲区大小,以匹配系统资源。
日志和错误处理
- 配置适当的错误页,以提供用户友好的错误信息。
- 设置日志级别,确保及时记录关键事件和故障排查信息。