nginx 的网站如果用源码安装的,是在安装目录的 html 里面
httpd 用源码安装是在安装目录里面的 htdocs 里面
nginx 的网站如果是 yum 安装的就在 /usr/share/nginx/html 里面
httpd yum安装则是在 /var/www/html 里面
1、Nginx介绍
nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。Nginx是由伊戈尔?赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为22200万个网站。 Nginx是一个安装非常简单、配置文件非常简洁(还能够支持perl语法),Bug非常少的服务,Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动,你还能够不间断服务的情况下进行软件版本的升级。 Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。官方数据表明能够支持高达 50,000 个并发连接数的响应,而我们常用的Tomcat一般500-600左右。
正向代理和反向代理可以理解为,一个是隐藏的用户,一个是隐藏的服务器。
2、Nginx的特性和优点
Nginx的特性
nginx是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:
- 在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应
- 使用epoll and kqueue作为开发模型
- nginx作为负载均衡服务器:nginx既可在内部直接支持和PHP程序对外进行服务,也可支持作为HTTP代理服务器对外进行服务
- nginx采用C进行编写,不论系统资源开销还是CPU使用效率都比Perlbal要好很多
Nginx的优缺点
优点:
- 占内存小,可实现高并发连接(同时最多能接受多少来自用户的请求信息),处理响应快
- 可实现http服务器、虚拟主机、方向代理、负载均衡
- Nginx配置简单
- 可以不暴露正式的服务器IP地址
缺点: - 动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用nginx作为反向代理抗住压力
3、Nginx的功能及应用类别
Nginx的基本功能
- 静态资源的web服务器,能缓存打开的文件描述符
- http、smtp、pop3协议的反向代理服务器
- 缓存加速、负载均衡
- 支持FastCGI(fpm,LNMP),uWSGI(Python)等
- 模块化(非DSO机制),过滤器zip、SSI及图像的大小调整
- 支持SSL
Nginx的扩展功能
- 基于名称和IP的虚拟主机
- 支持keepalive
- 支持平滑升级(用户感知不到升级)
- 定制访问日志、支持使用日志缓冲区提高日志存储性能
- 支持URL重写
- 支持路径别名
- 支持基于IP及用户的访问控制
- 支持速率限制,支持并发数限制
Nginx应用场景
- http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
- 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机
- 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
- nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
4、Nginx的模块与工作原理 Nginx模块分类
Nginx的模块从结构上分为核心模块、基础模块和第三方模块:
- 核心模块:HTTP模块、EVENT模块和MAIL模块。
- 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块。
- 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。
用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大 Nginx的模块从功能上分为如下三类:
- Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。
- Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
- Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
Nginx的工作原理
nginx的模块直接被编译进nginx,因此属于静态编译方式。
启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。
在解析配置文件时,nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。
nginx的进程架构: 启动nginx时,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker线程,一个worker线程用来处理n个request。
?下图展示了nginx 模块一次常规的HTTP请求和响应的过程
?下图展示了基本的WEB服务请求步骤
5、Nginx的安装与配置
Nginx安装
//创建系统用户nginx
[root@nginx ~]# useradd -r -M -s /sbin/nologin nginx
//安装依赖环境
[root@nginx ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
[root@nginx ~]# yum -y groups mark install 'Development Tools'
//创建日志存放目录
[root@nginx ~]# mkdir -p /var/log/nginx
[root@nginx ~]# chown -R nginx.nginx /var/log/nginx
[root@nginx ~]# cd /usr/src/
[root@nginx src]# wget http://nginx.org/download/nginx-1.12.1.tar.gz
--2021-10-25 22:24:23-- http://nginx.org/download/nginx-1.12.1.tar.gz
正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ...
正在连接 nginx.org (nginx.org)|3.125.197.172|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:980831 (958K) [application/octet-stream]
正在保存至: “nginx-1.12.1.tar.gz”
100%[============================================================>] 980,831 218KB/s 用时 4.4s
2021-10-25 22:25:28 (218 KB/s) - 已保存 “nginx-1.12.1.tar.gz” [980831/980831])
[root@nginx src]# ls
debug kernels nginx-1.12.1.tar.gz
[root@nginx src]# tar xf nginx-1.12.1.tar.gz
[root@nginx src]# cd nginx-1.12.1
[root@nginx nginx-1.12.1]# ./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-debug \
> --with-http_ssl_module \
> --with-http_realip_module \
> --with-http_image_filter_module \
> --with-http_gunzip_module \
> --with-http_gzip_static_module \
> --with-http_stub_status_module \
> --http-log-path=/var/log/nginx/access.log \
> --error-log-path=/var/log/nginx/error.log
//安装软件
[root@nginx nginx-1.12.1]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
Nginx配置
添加环境变量,让系统可以找到Nginx
[root@nginx ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@nginx ~]# . /etc/profile.d/nginx.sh //刷新
服务控制方式,使用nginx命令 控制选项
-t //检查配置文件语法
-v //输出nginx的版本
-c //指定配置文件的路径
-s //发送服务控制信号,可选值有{stop|quit|reopen|reload}
-t 检查配置文件语法是否有误
[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
-v 输出nginx的版本,大V列出编译安装时都安装了什么软件
//小v查看系统版本
[root@nginx ~]# nginx -v
nginx version: nginx/1.12.1
//大V查看编译安装时都安装了什么软件
[root@nginx nginx-1.12.1]# nginx -V
nginx version: nginx/1.12.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
//-c 指定配置文件的路径
//以下操作修改配置文件并丝滑的让新的配置文件生效
[root@nginx ~]# cd /usr/local/nginx/conf/
[root@nginx conf]# ls
fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
fastcgi_params koi-win nginx.conf scgi_params.default win-utf
[root@nginx conf]# cp nginx.conf mime.types /opt/ #nginx.conf是配置文件,包含mime.types,所以这两个文件都需要一起copy过去
[root@nginx ~]# cd /opt/
[root@nginx opt]# ls
mime.types nginx.conf
[root@nginx opt]# vi nginx.conf
#user nobody;
worker_processes 3; #修改数值
[root@nginx opt]# ps -ef|grep nginx
root 2443 1 0 19:09 ? 00:00:00 nginx: master process nginx
nginx 2444 2443 0 19:09 ? 00:00:00 nginx: worker process
root 18779 10152 0 19:16 pts/2 00:00:00 grep --color=auto nginx
[root@nginx opt]# nginx -s stop ; nginx -c /opt/nginx.conf #直接停掉然后启动
[root@nginx opt]# ps -ef|grep nginx
root 19164 1 0 19:16 ? 00:00:00 nginx: master process nginx -c /op
t/nginx.conf #发现worker变成修改的三个,新的配置文件生效
nginx 19165 19164 0 19:16 ? 00:00:00 nginx: worker process
nginx 19166 19164 0 19:16 ? 00:00:00 nginx: worker process
nginx 19167 19164 0 19:16 ? 00:00:00 nginx: worker process
root 19339 10152 0 19:16 pts/2 00:00:00 grep --color=auto nginx
//-s 发送服务控制信号,可选值有{stop|quit|reopen|reload}
[root@nginx opt]# nginx -s quit #非常优雅的停掉了它
[root@nginx opt]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
开机自启
[root@nginx ~]# cp /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/nginxd.service
[root@nginx ~]# vim /usr/lib/systemd/system/nginxd.service
[Unit]
Description=nginx server daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
[Install]
WantedBy=multi-user.target
[root@nginx ~]# systemctl daemon-reload //重新加载配置文件
[root@nginx ~]# systemctl enable --now nginxd //启动nginx并设置开机自启
Created symlink /etc/systemd/system/multi-user.target.wants/nginxd.service → /usr/lib/systemd/system/nginxd.service.
6、nginx的配置文件详解
主配置文件:/usr/local/nginx/conf
默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件 可以在启动nginx时通过-c选项来指定要读取的配置文件 nginx常见的配置文件及其作用
配置文件 | 作用 |
---|
nginx.conf | nginx的基本配置文件 | mime.types | MIME类型关联的扩展文件 | fastcgi.conf | 与fastcgi相关的配置 | proxy.conf | 与proxy相关的配置 | sites.conf | 配置nginx提供的网站,包括虚拟主机 |
nginx.conf配置详解
nginx.conf的内容分为以下几段:
main配置段:全局配置段。其中main配置段中可能包含event配置段 event {}:定义event模型工作特性 http {}:定义http协议相关的配置 Nginx配置文件示例
[root@localhost ~]# vim /usr/local/nginx/conf
# 全局块
user www-data; ##用户
worker_processes 2; ## 默认1,一般建议设成CPU核数1-2倍
error_log logs/error.log; ## 错误日志路径
pid logs/nginx.pid; ## 进程id
# Events块
events {
# 使用epoll的I/O 模型处理轮询事件。
# 可以不设置,nginx会根据操作系统选择合适的模型
use epoll;
# 工作进程的最大连接数量, 默认1024个
worker_connections 2048;
# http层面的keep-alive超时时间
keepalive_timeout 60;
# 客户端请求头部的缓冲区大小
client_header_buffer_size 2k;
}
# http块
http {
include mime.types; # 导入文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型
# 日志格式及access日志路径
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
# 允许sendfile方式传输文件,默认为off。
sendfile on;
tcp_nopush on; # sendfile开启时才开启。
# http server块
# 简单反向代理
server {
listen 80;
server_name domain2.com www.domain2.com;
access_log logs/domain2.access.log main;
# 转发动态请求到web应用服务器
location / {
proxy_pass http://127.0.0.1:8000;
deny 192.24.40.8; # 拒绝的ip
allow 192.24.40.6; # 允许的ip
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 负载均衡
upstream backend_server {
server 192.168.0.1:8000 weight=5; # weight越高,权重越大
server 192.168.0.2:8000 weight=1;
server 192.168.0.3:8000;
server 192.168.0.4:8001 backup; # 热备
}
server {
listen 80;
server_name big.server.com;
access_log logs/big.server.access.log main;
charset utf-8;
client_max_body_size 10M; # 限制用户上传文件大小,默认1M
location / {
# 使用proxy_pass转发请求到通过upstream定义的一组应用服务器
proxy_pass http://backend_server;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
用于调试、定位问题的配置参数
daemon {on|off}; //是否以守护进程方式运行nginx,调试时应设置为off
master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置 级别; //配置错误日志
error_log里的位置和级别能有以下可选项:
位置 | 级别 |
---|
file stderr syslog:server=address[,parameter=value] memory:size | debug:若要使用debug级别,需要在编译nginx时使用--with-debug选项 info notice warn error crit alert emerg |
|