是一个高性能的开源的Web服务器软件,也可以用作反向代理服务器、负载均衡器、以及HTTP缓存。它最初由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发。Nginx的设计目标是提供高性能、稳定性和低资源消耗,特别适用于处理大量并发连接。它通常用于加速静态内容的传输,处理动态内容的反向代理,以及作为负载均衡器分配流量到多个服务器。
nginx是一款高性能而且轻量级的web服务软件。
提供静态页面服务。纯文本格式的文件,一般都是以.htm格式为结尾的文件。
稳定性一般(nginx的bug很多,更新迭代很快。)httpd阿帕奇在国内用的比较少,国外主要还是他nginx开源(免费),阿里就是基于nginx二次开发: tengine。
对于系统的资源消耗非常低,http协议(单台物理服务器可以支撑并发量30000-50000台,在工作中一般设为20000个左右,保持服务器稳定。)
处理静念页面,可以直接提供静态页面的文件服务。html,图片,动画也可以。能够高效的处理并且响应静态页面的请求。(静态页面)。
反向代理,可以通过反向代理实现负载均衡和高可用。
处理动态请求,nginx是把动态请求转发到后端服务器,由专门处理动态请求的服务器进行处理。
支持加密的http协议:https。
支持虚拟主机
支持url重定向功能,页面跳转
自带缓存机制,可以静态页面内容,减轻后端服务器压力
自带日志记录,访问日志(哪些主机访问了本机的nginx服务),报错日志(访问失败的记录,配置文件的错误,nginx启动失败的记录)
可以支持模块扩展,可以加载不同的模块和自定义配置。
低内存消耗:10000个keep-alive连接保持,只占3M不到的内存11、支持热部署,不停机更新配置文件,升级版本。
nginx在工作中主要的应用场景
1、静态页面服务
2、转发动态请求
3、反向代理,负载均衡
4、缓存服务
5、连接保持和会话保持。
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
该命令是在Linux系统中使用useradd命令创建一个新用户,并设置相关参数。具体解析如下:
useradd
: 这是创建新用户的命令。
-M
: 该选项表示不创建用户的家目录(home directory)。通常,系统用户(如nginx)不需要一个可登录的家目录,因此使用此选项可以避免创建不必要的目录。
-s /sbin/nologin
: 该选项指定了用户登录时使用的shell。在这里,/sbin/nologin
是一个特殊的shell,它通常用于那些不允许登录的用户,例如系统服务用户。使用这个shell可以有效地禁止该用户登录系统。
nginx
: 这是要创建的新用户的用户名,此处假设是为Nginx服务创建的用户。
综合起来,这个命令创建了一个名为nginx的用户,不分配家目录,而且设置了禁止登录的shell,适用于作为服务用户运行的情况,提高系统的安全性。
cd /opt/
tar -xf nginx-版本号.tar.gz
cd nginx-版本号/
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
./configure --prefix=/usr/local/nginx \ --user=nginx \
指定用户名
--group=nginx \
指定所在组
--with-http_ssl_module \
支持https协议
--with-http_v2_module \
支持http2.0协议
--with-http_realip_module \
支持从客户端获取真实ip。
--with-http_stub_status_module \
支持访问nginx状态信息的方法。
--with-http_gzip_static_module \
支持对页面进行压缩的功能
--with-pcre \
支持pcre库的支持
--with-stream \
可以支持stream模块,可以支持四层代理
--with-stream_ssl_module \
支持加密传输的四层代理
--with-stream_realip_module
允许nginx从代理(proxy)协议的头部获取客户端的真实ip地址。
编译安装
make && make install
make: 这是一个用于构建和编译项目的命令。通常,在一个项目的根目录中存在一个名为 "Makefile" 的文件,其中包含了一系列规则和命令,用于指导构建过程。运行 make 命令将根据这些规则执行相应的命令,以生成最终的可执行文件或库等。
make install: 一旦通过 make 构建了软件,make install 命令通常用于将生成的可执行文件、库文件等安装到系统中。这可能涉及将文件复制到标准的系统目录,以便其他用户或系统进程可以访问它们。 综合起来,make && make install 是一个常见的软件构建和安装过程的缩写。首先,通过 make 构建项目,然后通过 make install 将生成的二进制文件和相关资源安装到系统中。这两个步骤通常在软件从源代码编译到可执行文件并安装到系统之间完成。
将nginx以及其下的所有文件所属组和所属用户改为nginx
chown -R nginx.nginx /usr/local/nginx
优化路径:软连接,将Nginx的可执行文件链接到/usr/sbin/
目录,使得可以在系统中更方便地使用nginx
命令。
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
检测文件配置是否正确以及配置文件语法是否正确
nginx -t
打开Nginx的Systemd服务配置文件的命令。Systemd是Linux系统中的一个初始化系统和服务管理器,用于在系统启动时启动和管理后台服务。
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/run/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
创建目录,方便管理
mkdir -p /usr/local/nginx/run/
修改配置文件
vim /usr/local/nginx/conf/nginx.conf
找到 pid的位置修改
pid /usr/local/nginx/run/nginx.pid;
这一行配置告诉Nginx在启动时将主进程的PID写入指定的文件中
重新加载配置
systemctl daemon-reload
systemctl start nginx.service
测试
vim /usr/local/nginx/html/index.html 100 dd 删除原内容
添加新内容:
打开浏览器,访问ip地址
yum安装
yum安装:编译安装和yum不要同时使用。两个服务不要即yum安装又编译安装,系统默认识别的是yum安装。
yum -y install epel-release
yum -y install nginx
nginx -h
nginx -v
nginx -V
nginx -t
nginx -T
这个命令可以快速查看配置文件的内容。
nginx -q
nginx -s
这个命令用于向Nginx主进程发送信号
nginx -p
该命令用于设置Nginx的工作目录前缀。
vim /etc/security/limits.conf
* soft nproc 65535
#*表示任意进程soft 软限制nproc linux最多能够开启多个进程65535个
* hard nproc 65535
#硬限制,进程最多只能到65535.
* soft nofile 65535
* hard nofile 65535
#进程能够打开的最大文件数:65535个
只有改完上面文件并重启虚拟机后,后面的events配置才能生效
vim /usr/local/nginx/conf/nginx.conf
#user nobody;
#运行用户,编译时未指定,默认就是nobaby
worker_processes 2;
#工作进程数量,根据cpu来进行配置,一般是cpu内核数的2备,访问量不大,1,足够了
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid /usr/local/nginx/run/nginx.pid;
#指定nginx的pid文件位置。
#以上都是全局配置,对全局生效。
events {
worker_connections 10000;
#每个进程可以支持的并发连接数,要修改limits.conf。服务器和用户之间的网络连接。
}
http {
#可以配置代理,缓存 定义日志,虚拟主机和第三方的模块功能。
include mime.types;
events {
worker_connections 10000;
#每个进程可以支持的并发连接数,要修改limits.conf。服务器和用户之间的网络连接。
}
http {
#可以配置代理,缓存 定义日志,虚拟主机和第三方的模块功能。
include mime.types;
default_type application/octet-stream;
#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;
#支持下载功能
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#连接保持,但是秒
gzip on;
#开启gzip的压缩模式,也就是对页面进行压缩
server {
#server模块就是nginx的虚拟主机模块,只能写在http模块中。
listen 80;
#虚拟主机的监听端口 80.
server_name localhost;
#虚拟主机的域名,可以有多个,要用逗号隔开。
charset utf-8;
#网页的默认字符集。
#access_log logs/host.access.log main;
location / {
#指定虚拟主机的默认工作目录。一个server可以有多个location.
root html;
index index.html index.htm;
}
nginx 配置文件有三部分组成
全局模块:用户和工作进程
events模块:配置连接数
http模块:代理地址,日志,虚拟主机等都在http
一个http模块中,可以有多个server快,server模块只能在http模块之中。
location模块只能写在server模块当中,一个server模块可以有多个location(匹配工作目录。)
events
模块:主要用于配置全局事件处理选项,如连接超时、工作进程数等。
配置Nginx如何处理网络事件。
http
模块:主要用于配置全局HTTP服务器选项。
定义HTTP服务器块,包括server
块的配置。
配置HTTP请求和响应的相关设置,如缓存、代理、日志等。
server
模块:用于定义虚拟主机(多个网站共享一个服务器的情况)的配置。
配置监听的端口、主机名、SSL、代理等。
location
模块:用于定义请求匹配位置的配置。
配置请求的URI匹配规则,如正则表达式或前缀匹配。
定义请求的处理方式,如代理、重定向、访问控制等。
Proxy
模块:proxy 模块是 Nginx 的核心模块之一,用于实现反向代理功能。
它允许将客户端的请求代理到后端的服务器,并将响应返回给客户端。
proxy 模块支持 HTTP、HTTPS、FastCGI、uWSGI、SCGI 等多种协议。
通过配置 proxy_pass 指令,可以指定代理的后端服务器地址。
Headers
模块:headers 模块用于处理 HTTP 请求和响应的头部信息。它允许添加、修改或删除请求头和响应头,实现对头部信息的定制化控制。headers 模块提供了一系列的指令,
如 addheader、setheader、moresetheaders 等,用于操作头部信息。
upstream
模块:用于定义负载均衡池,通常在反向代理中使用。用于配置反向代理服务器组(也称为上游服务器组)
配置后端服务器的地址、权重和其他参数。
它定义了后端服务器的列表和相关的负载均衡策略,用于分发请求到后端服务器。
upstream 模块通过 upstream 块来配置后端服务器组,其中包括 server 指令用于定义后端服务器。
stream
模块:stream 模块是 Nginx 的流处理模块,用于配置Nginx的TCP/UDP代理。
适用于代理非HTTP流量,如数据库连接、DNS请求等。
mail
模块:用于配置Nginx邮件代理服务器的选项。
包括配置邮件代理服务器的监听端口、SMTP、IMAP等。
它提供了 TCP/UDP 代理、负载均衡、数据包过滤等功能。stream 模块通过 stream 块来配置流的处理规则,可以根据目标地址和端口等条件进行流量的转发和处理。
每个模块都有特定的配置指令,用于控制不同方面的服务器行为。通过组合这些模块和指令,可以根据需求配置Nginx服务器的各个方面,包括HTTP、负载均衡、反向代理、静态文件服务等。注意,Nginx的配置文件结构允许嵌套和继承,以实现更复杂的配置需求。
location / {
# 这里是针对根路径 / 的配置
# 包括处理请求的方式、代理设置、缓存设置等
}
root
指令:root
指令用于定义服务器块中所有 location
块的文件系统根目录。这意味着 root
设置的路径会与 URI 进行拼接,以构建完整的文件系统路径。示例:
server {
listen 80;
server_name example.com;
root /path/to/your/web/root;
location / {
# 此时访问 http://example.com/index.html 会映射到 /path/to/your/web/root/index.html
}
}
alias
指令:alias
指令用于为特定的 location
指定一个与 URI 不同的文件系统路径。这意味着 URI 的一部分会被替换为 alias
指定的路径。示例:
server {
listen 80;
server_name example.com;
location /static/ {
alias /path/to/your/static/files/;
# 访问 http://example.com/static/image.jpg 会映射到 /path/to/your/static/files/image.jpg
}
}
nginx是通过alias设置虚拟目录,在nginx的配置中,alias目录和root目录是有区别的:
1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的;
2)root指定的目录是location匹配访问的path目录的上一级目录,这个path目录一定要是真实存在root指定目录下的;
3)使用alias标签的目录块中不能使用rewrite的break(具体原因不明);另外,alias指定的目录后面必须要加上"/"符号!!
4)alias虚拟目录配置中,location匹配的path目录如果后面不带"/",那么访问的url地址中这个path目录后面加不加"/"不影响访问,访问时它会自动加上"/"; 但是如果location匹配的path目录后面加上"/",那么访问的url地址中这个path目录必须要加上"/",访问时它不会自动加上"/"。如果不加上"/",访问就会失败!
5)root目录配置中,location匹配的path目录后面带不带"/",都不会影响访问。
其他区别: 1、 alias 只能作用在location中,而root可以存在server、http和location中。 2、 alias 后面必须要用 “/” 结束,否则会找不到文件,而 root 则对 ”/” 可有可无。
配置文件
vim /usr/local/nginx/conf/nginx.conf
location /status {
stub_status on;
access_log off;
}
这个配置片段的作用是:
location /status
定义了一个 URL 路径,当访问该路径时,将触发状态统计模块。
stub_status on;
启用了 Nginx 的状态模块,允许获取有关 Nginx 服务器状态的信息,如活跃连接数、请求数等。此时就是打开访问统计功能。
access_log off;
禁用了访问日志,这意味着当访问 /status
时,不会记录访问日志,以保护状态信息的隐私。
检验语法:nginx -t
重启服务:systemctl restart nginx.service
打开浏览器测试
Active connections: 1 - 当前活跃的连接数。这包括已建立的连接,但尚未完成的请求,以及当前处理的请求。
server accepts handled requests - 这一行中的数字表示服务器接受、处理和已处理的请求数。
accepts: 1 - 表示自服务器启动以来已接受的连接数。
handled: 1 - 表示自服务器启动以来成功处理的连接数。tcp握手成功次数。
requests: 3 - 表示自服务器启动以来收到的请求总数。
Reading: 0 Writing: 1 Waiting: 0 - 这些数字表示当前正在处理的连接的状态。
Reading: 0 - 服务器从客户端读取请求的连接数。
Writing: 1 - 服务器向客户端发送响应的连接数。
Waiting: 0 - 这是等待请求的连接数,通常是在 keep-alive 连接中,等待下一个请求。
测试其他主机对服务器连通性
配置文件
vim /usr/local/nginx/conf/nginx.conf
deny 192.168.41.11;
- 拒绝来自 IP 地址 192.168.41.11
的访问。这意味着如果请求来自这个 IP 地址,Nginx 将返回403 Forbidden响应。
allow all;
- 允许所有其他 IP 地址的访问。
这个配置的效果是,允许所有 IP 地址访问网站的根路径,除了来自 192.168.41.11
的请求
配置结果测试
可以看到,访问失败。
配置文件
vim /usr/local/nginx/conf/nginx.conf
server_name www.test.com;
- 指定了该服务器块所响应的域名。在这里,服务器将响应来自 www.test.com
的请求。这是用于指定服务器应该响应哪个域名的设置。
root /var/www/html/test;
- 指定了服务器上存储网站文件的根目录。在这个例子中,根目录被设置为 /var/www/html/test
。当有请求到达时,Nginx 将会在这个目录中查找相应的文件来提供服务。
准备测试文件
分别准备了/var/www/html/test
和 /var/www/html/benet
目录以匹配url,以及两个测试的index.html文件
配置DNS映射
vim /etc/hosts
它将两个域名 www.test.com
和 www.benet.com
映射到 IP 地址 192.168.41.10
。这样配置的作用是告诉操作系统,当你在浏览器或其他网络应用中输入 www.test.com
或 www.benet.com
时,系统应该将这些域名解析到指定的 IP 地址 192.168.41.10
。
测试
到配置了DNS映射的主机中,打开浏览器,测试。
可以看到域名解析成功
配置文件
vim /usr/local/nginx/conf/nginx.conf
这一行配置的效果是,Nginx 服务器将仅监听在 IP 地址 192.168.41.10
上的端口 80
,并等待来自客户端的连接。这是典型的 HTTP 服务配置,客户端可以通过在浏览器中输入 http://192.168.41.10
或 http://www.example.com
(如果 DNS 配置正确)来访问该服务器。
配置虚拟网卡
这个错误消息表明在尝试启动或测试 Nginx 配置时遇到了问题。让我们逐步解释错误消息:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
- 这一部分告诉你 Nginx 配置文件的语法是正确的,没有语法错误。这是一个正面的消息,表示 Nginx 成功验证了配置文件的语法。
nginx: [emerg] bind() to 192.168.41.100:80 failed (99: Cannot assign requested address)
- 这一部分是一个紧急错误([emerg]
),表明 Nginx 尝试绑定到 192.168.41.100:80
失败,原因是操作系统无法分配所请求的地址。可能是因为 IP 地址 192.168.41.100
在系统网络配置中不存在,或者由于权限问题无法绑定到该地址。
添加虚拟网卡
ifconfig ens33:0 192.168.41.100/24
为 ens33
接口创建一个虚拟 IP 地址 192.168.41.100
,允许这个 IP 地址与主要接口 ens33
共存。
测试
这样就实现了不同ip和端口配置访问链接
下载httpd-tool
yum -y install httpd-tools.x86_64
添加一个测试用户
useradd test
htpasswd -c /usr/local/nginx/passwd.db.test
#当你运行这个命令时,它会提示你输入一个密码,并将该密码的散列值(哈希值)存储在指定的密码文件中。通常,这种做法用于配置 Nginx 或其他Web服务器以进行基本身份验证。
将密码文件所有者改为nginx,并只赋权读权限(为了安全)
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db
配置文件
vim /usr/local/nginx/conf/nginx.conf
auth_basic "secret";
- 启用基本身份验证,并设置验证时显示的提示信息为 "secret"。这意味着访问该路径的用户需要提供用户名和密码才能访问。
auth_basic_user_file /usr/local/nginx/passwd.db;
- 指定了包含用户名和密码散列值的文件的路径。该文件通常是由 htpasswd
命令创建的,用于验证用户提供的用户名和密码。
这个配置的效果是,对于访问根路径 /
的用户,Nginx 将尝试提供位于 /var/www/html/test
目录下的 index.html
或 index.htm
文件,并要求用户提供用户名和密码,以便访问。用户名和密码是从 /usr/local/nginx/passwd.db
文件中获取的。
测试