Nginx简介
-
高性能Web服务器
[Nginx性能] Nginx 的高并发,官方测试支持 5 万并发连接。实际生产环境能到 2-3 万并发连接数。10000 个非活跃的 HTTP keep-alive 连接仅占用约 2.5MB 内存。三万并发连接下,10 个 Nginx 进程,消耗内存 150M。淘宝 tengine 团队测试结果是“24G 内存机器上,处理并发请求可达 200 万”。
-
静态资源:html、css、js、img、视频、音频;
-
反向代理:代理客户访问内部(本机、局域网的服务器)服务;
-
负载均衡:将请求(流量)分发给集群中的多台服务器,避免单点压力过大;
[Nginx负载均衡] nginx 的负载均衡策略可以划分为两大类:内置策略和扩展策略。内置策略包含加权轮询和 ip hash,在默认情况下这两种策略会编译进 nginx 内核,只需在 nginx 配置中指明参数即可。扩展策略有很多,如 fair、通用 hash、consistent hash 等,默认不编译进 nginx 内核。
-
网站(后端API)入口:根据访问请求的路径参数,进行分发实现动静分离;
-
之所以性能高,是因为Nginx架构:多进程+单线程架构、适合多核处理器;
-
1个Master进程,N个Work进程;
-
Master监控所有Work进程,旧的Work进程终止时,随时可以启动新的进程;
-
Work进程使用单线程接收请求处理请求,避免了线程切换带来的消耗;
-
IO多路复用技术:异步非阻塞架构,同时处理更多的请求;
-
异步非阻塞是“任务完成了通知你”,IO多路复用是“同时盯多个任务,看谁先完成”——两者结合,就是高性能服务器的核心逻辑。
-
Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
延伸版本:tengine(淘宝)、openresrt(章亦春)等
Ngnix 特点
- 模块化设计:良好的扩展性,可以通过模块方式进行功能扩展。
- 高可靠性:主控进程和 worker 是同步实现的,一个 worker 出现问题,会立刻启动另一个 worker。
- 内存消耗低:一万个长连接(keep-alive),仅消耗 2.5MB 内存。
- 支持热部署:不用停止服务器,实现更新配置文件,更换日志文件、更新服务器程序版本。
- 并发能力强:官方数据每秒支持 5 万并发;
- 功能丰富:优秀的反向代理功能和灵活的负载均衡策略
Nginx 功能
- 支持静态资源的 web 服务器。
- http,smtp,pop3 协议的反向代理服务器、缓存、负载均衡;
- 支持 FASTCGI(fpm)
- 支持模块化,过滤器(让文本可以实现压缩,节约带宽),ssl 及图像大小调整。
- 内置的健康检查功能
- 基于名称和 ip 的虚拟主机
- 定制访问日志
- 支持平滑升级
- 支持 KEEPALIVE
- 支持 url rewrite
- 支持路径别名
- 支持基于 IP 和用户名的访问控制。
- 支持传输速率限制,支持并发数限制。
Nginx安装
-
apt/yum安装
apt update apt install -y nginx
-
源码编译安装
## 安装依赖 sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev ## 下载源码(nginx.org搜索官方最新的版本,点进去有Linux和Windows版本,选择Linux版本并复制链接) # wget http://192.168.57.200/Software/nginx-1.26.2.tar.gz(局域网) wget https://nginx.org/download/nginx-1.29.1.tar.gz ## 解压 tar -zxvf nginx-*.tar.gz ## 进入解压后的Nginx源码目录 cd nginx-1.29.1/ ## 执行配置脚本,并指定安装目录和其他选项 ./configure --prefix=/usr/local/nginx --with-http_ssl_module ## 编译并安装 make && sudo make install
静态网站制作:
由于是编译安装所以没有/etc/nginx目录,默认存放在/usr/local/nginx,nginx命令在/usr/local/nginx/sbin/目录里,可以把它软链接到root下:ln -s /usr/local/nginx /usr/local/nginx/sbin/nginx
补充静态网站配置文件里改和不改的内容:
静态网站的核心需求是:指定首页文件(如 index.html)、确保目录访问逻辑正常。结合你的配置,需处理以下几处:
在第 42 行 root /var/www/html; 下方 新增一行: index index.html index.htm;
# 备份一个源文件以免后期出错(也可以不备份,已经有一个默认版本) cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak # 编辑配置文件 vim /usr/local/nginx/conf/nginx.conf ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #user nobody; 第2行是启动Work进程的用户 worker_processes 1; 第3行是默认启动1个Work进程,也可以设置成auto ,让它根据CPU核心数量自动启动Work进程 #error_log logs/error.log; 第5行是全局错误日志 #pid logs/nginx.pid; 第9行是进程号存储的路径 events { #enevts模块配置(性能优化配置) use epoll; #使用epoll事件模型(Linux) worker_connections 1024; 第12~14行是每个worker最大连接数 multi_accept on; #一次性接受所有新连接,并发量高 accept_mutex on; #启用连接接收互斥锁 } xxx(其余的修改见上方) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # 创建/var/www/html目录(如果root下路径改成了这个的话要创建),在下面vim index.html文件(也就是网站的首页配置) # 检查语法是否正确 /usr/local/nginx/sbin/nginx -t # 重新加载配置 /usr/local/nginx/sbin/nginx -s reload #测试网站是否能访问: 由于你的 Nginx 监听 9050 端口(第 39-40 行),在浏览器输入: 本地访问:http://localhost:9050 局域网访问:http://你的服务器IP:9050 (前提:确保 /var/www/html 目录下存在 index.html 文件,否则会显示目录列表 —— 因你已启用 autoindex on)。
-
HTTPS 相关配置(第 95-112 行): 第 95 行
#server {
及以下的 443 端口、ssl 证书配置,需保持注释(你未提供 SSL 证书文件cert.pem
/cert.key
,启用会导致 Nginx 启动失败)。 -
PHP 相关配置(第 56-58 行、62-68 行): 这些是反向代理 PHP 脚本或连接 FastCGI 的配置,静态网站无需 PHP 解析,保持注释即可。
- .htaccess 限制(第 73-75 行):
.htaccess
是 Apache 的配置文件,Nginx 不识别,无需启用,保持注释。 -
[docker安装]
docker run --name myNginx \
-p 80:80 \
-v /data/www/html:/usr/share/nginx/html \
-d nginx
Nginx常用命令
nginx 启动Nginx
nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen 重新打开日志文件。
nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t 不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v 显示 nginx 的版本。
nginx -V 显示 nginx 的版本,编译器版本和配置参数。
使用系统服务管理工具管理Nginx
systemctl reload nginx
vim /usr/lib/systemd/system/nginx.service
++++++++++++++++++++++++++++++++++++++++
[Unit] #简介
Description=The NGINX HTTP and reverse proxy server
After=syslog.target 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=/bin/kill -s QUIT $MAINPID #关闭
PrivateTmp=true
[Install]
WantedBy=multi-user.target
++++++++++++++++++++++++++++++++++++++++++
# 重新加载nginx或者关了再开
systemctl daemon-reload
systenctl reload nginx
Nginx基本配置
全局配置
http配置:所有HTTP请求与响应的配置
-
server配置:网站配置;可以配置多个(虚拟主机)
-
location配置:网站路径配置;
-
http{
include mime.types; #引入加载外部模块,子配置文件;mime.types是文件格式,文件类型+文件后缀,如果有新的可以加在后面;
default_type application/octet-stream; #默认类型,二进制流MIME类型,表示“未知的二进制数据”,不存在就默认使用此类型,需要下载的文件
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 on; #通过内核级数据传输减少CPU消耗和延迟,加速
tcp_nopush on; #配合sendfile,合并小包发送
keepalive_timeout 65; #长连接超时时间65秒,优化设置,延长访问时间
#gzip on; #启动压缩,减少带宽,节省流量;但每次运算会占用CPU资源
server {
listen 80; #监听的端口
server_name localhost; #绑定域名,一台服务器可以使用多个域名
#charset koi8-r; #设置默认字符集
#access_log logs/host.access.log main; #设置独立的访问日志路径
location / { #设置网站的根路径;
root html; #设置网站根目录对应的系统目录;默认是nginx安装路径下的html路径,/usr/local/nginx/html可以改成/var/www/html
index index.html index.htm; #指定首页名称
}
error_page 500 502 503 504 /50x.html;
location = /50x.html { #报错的话就找这个目录
root html;
}
#location ~ \.php$ { #反向代理
# proxy_pass http://127.0.0.1; #只要是以.php结尾的文件,就自动访问这个内部网站
#}
}
}
静态网站
搭建文件下载服务器
autoindex on; # 开启目录索引
autoindex_exact_size on; # 以易读单位显示文件大小
autoindex_localtime on; # 显示文件的本地时间(而非 GMT 时间)
server {
charset utf-8,gbk; # windows 服务器下设置后,依然乱码,暂时无解
listen 9050 default_server;
listen [::]:9050 default_server;
server_name down.blog.com;
root /data/;
}
虚拟主机,基于ip的虚拟主机,基于域名的虚拟主机,基于端口号的虚拟主机
代理与反向代理
负载均衡
优化配置
LNMP环境搭建
动静分离
Toncat基础
LNMT环境搭建
web集群搭建