一、Nginx 安装
环境准备
- 主机名:server
- IP:192.168.8.101/24
- 工具:WindTerm 远程连接
Web 服务器对比
- Unix和Linux平台下
- Apache(php)、Nginx(高并发)、Tengine、Lighttpd
- Tomcat(java)、BM WebSphere、Jboss
Apache,Tomcat和Nginx都支持http和https协议
- Windows平台下
- 微软公司的IIS(Internet Information Server)
Nginx 简介
- Nginx("engine x")
- 是俄罗斯人编写的十分轻量级的HTTP服务器
- 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/STMP代理服务器
- 默认端口号:80
- 官方网站:http://nginx.org/
Nginx 两种安装方式
- Nginx安装有两种方式:
- rpm软件包安装
- 源码编译安装(功能可以自定义、更加灵活)
- 将nginx-1.22.1.tar.gz (可以在Nginx官网下载)上传至虚拟机/root目录
- Nginx的依赖包:
- gcc:C语言解释器
- pcre-devel:是nginx支持正则表达式的扩展功能包
- openssl-devel:是nginx支持加密功能的扩展功能包
- make:提供make编译命令
- Nginx的依赖包:
源码编译安装完整步骤
1. 安装依赖
bash
dnf -y install gcc pcre-devel openssl-devel make
2. 创建运行用户
bash
useradd nginx #创建用于用于启动服务
3. 上传并解压源码包
bash
tar -xf /root/nginx-1.22.1.tar.gz #解压源码包
cd nginx-1.22.1 #切换目录
4. 配置编译参数
bash
./configure \ #初始化
> --prefix=/usr/local/nginx \ #指定安装目录为/usr/local/nginx
> --user=nginx \ #指定用户名(运行服务后进程的所有者)
> --group=nginx \ #指定组(运行服务后进程的组)
> --with-http_ssl_module #支持加密功能
5. 编译并安装
bash
make && make install #编译 并 编译安装
6. 查看安装目录
bash
ls /usr/local/nginx #查看安装目录,有数据表示已安装
Nginx 目录结构
/usr/local/nginx:安装根目录conf:配置文件目录conf/nginx.conf:主配置文件
html:(/usr/local/nginx/html)默认网页根目录logs:存放日志文件的目录sbin主程序目录sbin/nginx:启动程序
二、Nginx 进程管理
- 启动Nginx服务:
- 通过源码编译安装的程序使用脚本程序来管理服务的启停
- nginx的服务管理程序:/usr/local/nginx/sbin/nginx
- -V(大写):查看编译参数(小写v仅查看版本)
- -t:检查主配置文件语法
查看版本与编译参数
bash
/usr/local/nginx/sbin/nginx -V #查看nginx版本信息和编译时的参数
/usr/local/nginx/sbin/nginx -v #仅查看nginx版本信息
检查配置文件语法
bash
/usr/local/nginx/sbin/nginx -t
服务控制命令
- Nginx服务启动、停止、重新加载配置文件
- nginx启动后不能重复启动,否则会报错端口被占用(Address already in use)
bash
# 停止Nginx
/usr/local/nginx/sbin/nginx -s stop
# 启动Nginx
/usr/local/nginx/sbin/nginx
# 重新加载配置(不中断业务)
/usr/local/nginx/sbin/nginx -s reload
查看端口与进程
bash
ss -nutlp | grep :80
ps aux | grep nginx
进程说明
master:主管理进程worker:工作进程(真正提供服务)
一个master可以管理多个worker进程

访问测试
浏览器访问(网络路径):http://192.168.8.101
默认首页位置(实际路径):/usr/local/nginx/html/index.html
/usr/local/nginx/html是nginx服务默认的网页根目录,存放所有网页
三、Nginx 配置文件详解
- Nginx主配置文件:/usr/local/nginx/conf/nginx.conf
- Nginx主配置文件解析,无需操作
核心配置段
bash
[root@server ~]# vim /usr/local/nginx/nginx.conf #打开Nginx主配置文件
#user nobody; #指定启动用户
worker_processes 1; #工作进程数(与cpu数相同)
#error_log logs/error.log; #错误日式位置(相对路径):/usr/local/nginx/logs/error.log
#error_log logs/error.log notice; #只要notice的日志
#error_log logs/error.log info;
#pid logs/nginx.pid;
#nginx的PID存放位置。
#当运行Nginx时就会自动创建,Nginx停止自动删除。
#必须要有这个pid文件才能正常停止nginx进程,否则会报错;nginx每次运行都会重新创建pid文件;若在运行前就存在,则会被新建的覆盖
events {
worker_connections 1024; #每个工作进程的最大连接数(最大并发量)。影响Nginx访问量的取决于硬件
}
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; #会话保持时间。客户端长连接超时65秒,网页空闲65秒无请求则断开,节省服务器开支
#gzip on;
server { #虚拟web主机配置,一个server就是一个网站
listen 80; #监听80端口,没有写IP地址,默认就是本机所有IP地址都监听
server_name localhost; #域名
#charset koi8-r;
#access_log logs/host.access.log main; #访问日志
location / { #匹配用户的访问URL,如果的意思,后边会重点讲解
root html; #此虚拟web主机的默认网页根目录
index index.html index.htm; #此虚拟web主机的默认首页文件,匹配即停止
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #报错之后的处理
location = /50x.html {
root html; #报错之后找这个
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ { #Nginx支持php动态页面的配置
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ { #Nginx支持php动态页面的配置
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server { #虚拟web主机模板
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server { #加密的虚拟web主机模板
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
Nginx虚拟web主机核心语法
user:运行用户worker_processes:工作进程数worker_connections:单进程最大连接数keepalive_timeout:长连接超时时间listen:监听端口server_name:域名root:网页根目录index:默认首页
bash
server {
listen 监听端口; #直接写个端口号就默认所有ip监听此端口
server_name 域名;
location / { #匹配用户访问的URL(后边重点讲,暂时知道即可)
root 网页根目录;
index 首页文件;
}
}
注意server与{之间的空格;每一个语句结束都要以分号结尾
Apache和Nginx虚拟主机的语法对比:

四、Nginx 用户认证
- 为了使站点访问时更加安全,可以为站点增加用户认证
bash
[root@server ~]# cp /usr/local/nginx/conf/nginx.conf /opt #备份nginx主配置文件,防止出错
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf #修改主配置文件
...此处省略1万字...
server {
...此处省略1万字...
location / { #如果访问此网站
root html;
index index.html index.htm;
auth_basic "auth-domain"; #开启用户认证功能,指定提示文字
auth_basic_user_file "/usr/local/nginx/pass"; #指定认证文件位置
}
...此处省略1万字...
}
- 根据nginx主配置文件中的内容,创建用户认证文件
- 使用htpasswd命令 创建登录的认证用户(用户名admin,密码123456)
- -c:创建指定的用户名密码存放的文件(如已存在此文件则无需重复-c,否则覆盖原有用户。不加-c会在该文件中追加新用户。指定的位置必须和配置文件中配置的一样)
bash
[root@server ~]# dnf -y install httpd-tools #安装软件包,提供htpasswd命令
[root@server ~]# htpasswd -c /usr/local/nginx/pass admin #创建登录用户,并记录至指定文件
New password: #密码123456,输入后回车,不显示
Re-type new password: #确认密码,输入后回车,不显示
[root@server ~]# htpasswd /usr/local/nginx/pass tom #无需重复-c创建新文件(密码123456)
[root@server ~]# /usr/local/nginx/sbin/nginx -s reload #重新加载nginx配置文件
[root@server ~]# ss -nutlp | grep :80 #确保端口正常运行
- 使用Windows浏览器访问测试
- 刷新nginx配置文件后,如果网页未能及时更新,请清空浏览器缓存重新访问
- 用户名:admin
- 密码:123456
注意:该配置写在哪个server,就对哪个server的网站生效
服务的配置文件是用来控制服务的功能的
五、Nginx 虚拟 Web 主机
- 虚拟web主机技术:使用一个nginx服务搭建多个web网站
虚拟主机三种类型
- 基于域名(最常用)
- 基于端口
- 基于 IP
基于域名虚拟主机配置模板(重点)
- 基于域名的虚拟web主机:访问的域名不同,则访问的网站不同
nginx
server {
listen 80;
server_name www.a.com; #域名1
location / {
root /usr/local/nginx/a; #域名1的网页根目录
index index.html; #默认首页
}
}
server {
listen 80;
server_name www.b.com; #域名2
location / {
root /usr/local/nginx/b; #域名2的网页根目录
index index.html;
}
}
基于端口虚拟主机配置模板
- 基于端口的虚拟web主机:访问的端口不同,则访问的网站不同
bash
server {
listen 8080; #端口8080
server_name www.haha.com; #同一个域名
...
root /usr/local/nginx/haha; #网页根目录1
...
}
server {
listen 8000; #端口8000
server_name www.haha.com; #同一个域名
...
root /usr/local/nginx/xixi; #网页根目录2
...
}
访问www.haha.com:8080与www.haha.com:8000会进入不同的网站
基于IP地址的虚拟主机配置模板
- 基于IP地址的虚拟web主机:访问的IP地址不同,则访问的网站不同
bash
server {
listen 192.168.8.101:80; #第一个IP地址监听80端口
server_name www.haha.com; #同一个域名
...
root /usr/local/nginx/haha; #网页根目录1
...
}
server {
listen 192.168.2.101:80; #第二个IP地址监听80端口
server_name www.haha.com; #同一个域名
...
root /usr/local/nginx/xixi; #网页根目录2
...
}
实战配置步骤
- 完成以下两个基于域名的虚拟web主机
- 第一个虚拟web主机
- 监听端口:80
- 域名:www.a.com
- 网页根目录:/usr/local/nginx/a
- 默认首页:index.html
- 默认首页内容:aaa
- 第二个虚拟web主机
- 监听端口:80
- 域名:www.b.com
- 网页根目录:/usr/local/nginx/b
- 默认首页:index.html
- 默认首页内容:bbb
- 配置第一个虚拟web主机
bash
[root@server ~]# cp /usr/local/nginx/conf/nginx.conf /opt/ #备份nginx主配置文件,防止写错
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf #修改主配置文件
...此处省略1万字,在第33行下方插入...
server { #server {} 表示这是一个虚拟web主机
listen 80; #监听80端口
server_name www.a.com; #域名为www.a.com
location / { #匹配此域名
root /usr/local/nginx/a; #指定网页根目录
index index.html index.htm; #指定首页文件,匹配即停止
}
}
...此处省略1万字...
[root@server ~]# mkdir /usr/local/nginx/a #创建网页根目录
[root@server ~]# echo aaa > /usr/local/nginx/a/index.html #创建首页文件,内容为aaa
- 配置第二个虚拟web主机
bash
[root@server ~]# cp /usr/local/nginx/conf/nginx.conf /opt/ #备份nginx主配置文件,防止写错
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf #修改主配置文件
...此处省略1万字,在第41行下方插入...
server { #server {} 表示这是一个虚拟web主机
listen 80; #监听80端口
server_name www.b.com; #域名为www.b.com
location / { #匹配此域名
root /usr/local/nginx/b; #指定网页根目录
index index.html index.htm; #指定首页文件,匹配即停止
}
}
...此处省略1万字...
[root@server ~]# mkdir /usr/local/nginx/b #创建网页根目录
[root@server ~]# echo bbb > /usr/local/nginx/b/index.html #创建首页文件,内容为aaa
- 修改完配置nginx服务的配置文件,需要重新加载配置文件
bash
[root@server ~]# /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件
[root@server ~]# ss -nutlp | grep :80 #查看端口,确保端口正常运行
如果nginx修改完配置文件,重新加载配置文件报错,可以根据提示进行错误定位,排错
也可以使用/usr/local/nginx/sbin/nginx -t 检查主配置文件的语法是否正确,如有报错,则定位错误配置并排查
- client主机修改/etc/hosts文件,解析www.a.cm和www.b.com,并且访问域名测试
bash
[root@client ~]# vim /etc/hosts
...在最后一行下方追加如下内容...
192.168.8.101 www.a.com www.b.com
[root@client ~]# curl www.a.com #客户端访问域名测试
aaa
[root@client ~]# curl www.b.com #客户端访问域名测试
bbb
六、HTTPS 加密网站
6.1 加密算法分类
- 加密算法一般分为对称算法、非对称算法、信息摘要
- 对称算法有:AES、DES,主要应用在单机数据加密
- 非对称算法有:RSA、DSA,主要应用在网络数据加密
- 信息摘要:MD5、sha256,主要应用在数据完整性校验
6.1.1对称加密
核心就是怎么加密,怎么解密
- AES
- DES
- 应用案例:RAR5、ZIP压缩加密(单机加密)
- 对称加密一般不用于网站加密
对称加密加解密快,但没法安全分发密钥;网站是陌生人双向通信,做不到私下提前约定同一个密钥,所以不能单独用,只能配合非对称加密用。
6.1.2非对称加密
加密、解密使用不同密钥,一把公钥、一把私钥,成对存在。
-
RSA
-
DSA
-
应用案例:网络加密(https、ssh)
-
非对称加密由服务端生成密钥对
-
将公钥传递给客户端,私钥始终保存在自己的服务器上,不传递
当进行数据传递时,客户端将公钥加密的数据传递到服务端,服务端使用私钥进行解密。
6.1.3信息摘要Hash值
- MD5
- SHA256
- SHA512
- 应用案例:数据完整性校验,只与文件内容 有关
通过Hash可以判断文件是否被更改
(只跟数据有关,跟文件名,权限等完全无关。
改动数据之后再改回去Hash值就会恢复)
bash
[root@server ~]# echo 123 > /opt/a.txt #创建文件,内容123
[root@server ~]# md5sum /opt/a.txt #查看md5值
ba1f2511fc30423bdbb183fe33f3dd0f /opt/a.txt
[root@server ~]# echo 456 >> /opt/a.txt #修改文件内容
[root@server ~]# md5sum /opt/a.txt #查看md5值,已变化
c010aff9dc6276fdb7efefd1a2757658 /opt/a.txt
6.2 SSL加密网站实操步骤
步骤一:生成密钥
- SSL加密网站的核心技术是非对称生成密钥,使用openssl加密工具
- 公钥、私钥、证书(内含公钥)
bash
[root@server ~]# cd /usr/local/nginx/conf #切换目录
[root@server ~]# openssl genrsa > cert.key 2048 #生成一个2048位的私钥,保存至cert.key
[root@server ~]# openssl req -new -x509 -key cert.key > cert.pem #生成证书
#注:req请求, -x509生成证书,-new新的证书,-key使用刚才的私钥文件,保存在cert.pem
- 修改Nginx主配置文件,配置加密的虚拟web主机
- 默认配置文件最下方有配置模板,打开注释修改即可
- 一定要确定在nginx安装的时候开启了加密模块(--with-http_ssl_module)
步骤二:4.5.2 配置加密的虚拟web主机
- 修改Nginx主配置文件,配置加密的虚拟web主机
bash
[root@server conf]# vim /usr/local/nginx/conf/nginx.conf #修改配置文件
...此处省略1万字...
server { #定义虚拟web主机
listen 443 ssl; #开启SSL
server_name www.test.com; #指定域名
ssl_certificate cert.pem; #指定证书文件
ssl_certificate_key cert.key; #指定私钥文件
...
location / {
root https; #指定网页根目录/usr/local/nginx/https
index index.html index.htm;
}
}
...此处省略1万字...
- 创建加密虚拟web主机的网页根目录,创建默认首页文件
- 重新加载配置文件
bash
[root@server conf]# mkdir /usr/local/nginx/https #创建网页根目录
[root@server conf]# echo "nginx-https" > /usr/local/nginx/https/index.htl #创建首页文件
[root@server conf]# /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件
[root@server conf]# ss -nutlp | grep nginx #查看nginx拥有443和80端口两个端口
- 服务端重新加载配置文件
- 客户端client主机修改/etc/hosts文件,指定域名解析,访问测试
bash
[root@client ~]# vim /etc/hosts
...此处省略1万字...
192.168.8.101 www.a.com www.b.com www.test.com
[root@client ~]# curl -k https://www.test.com:443 #访问测试,-k忽略安全风险
- Windows使用浏览器访问:https://192.168.8.11:443
- Windows没有做域名解析,可以直接使用IP地址访问