Nginx基础
Nginx初识
WEB服务
- WEB服务:网站服务:部署并启动服务就可以搭建网站
- WEB中间件:等同于WEB服务
- 中间件:范围更加广泛,指负载均衡之后的服务
- 数据库中间件:数据库缓存,消息队列
Nginx基础概述
#nginx简述
Nginx一个开源且高性能、可靠的 Http Web服务、代理服务。
开源:直接获取源代码
高性能: 支持海量并发
可靠: 服务稳定
#选择 nginx 服务的理由
Nginx非常轻量
功能模块少 (源代码仅保留http与核心模块代码,其余不够核心代码会作为插件来安装)
代码模块化 (易读,便于二次开发,对于开发人员非常友好)
互联网公司都选择 Nginx
1.Nginx技术成熟,具备的功能是企业最常使用而且最需要的
2.适合当前主流架构趋势, 微服务、云架构、中间层
3.统一技术栈, 降低维护成本, 降低技术更新成本。
Nginx采用Epool网络模型,Apache采用Select模型
Select: 当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。
Epool: 当用户发起请求,epool模型会直接进行处理,效率高效,并无连接限制。
Nginx快速安装
Nginx的安装方式
1.源码编译=>Nginx (1.版本随意 2.安装复杂 3.升级繁琐 4.规范 5.便于管理)
2.epel仓库=>Nginx (1.版本较低 2.安装简单 3.配置不易读)
3.官方仓库=>Nginx (1.版本较新 2.安装简单 3.配置易读)
Nginx官方仓库下载
# 添加nginx源
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# 安装nginx
yum install -y nginx
nginx-1.26.0
Nginx启停
# 启动nginx
systemctl start nginx
nginx
# 停止nginx
systemctl stop nginx
nginx -s stop
# 重启nginx
systemctl restart nginx
nginx -s restart
# 重载
systemctl reload nginx
Nginx目录详解
目录结构 | 详细说明 |
---|---|
/etc/nginx | nginx各种配置文件的目录 |
/etc/nginx/nginx.conf | 主配置文件 |
/etc/nginx/conf.d/ | 子配置文件 |
/etc/nginx/conf.d/default.conf | 默认子配置文件 |
/usr/sbin/nginx | nginx命令 |
/usr/share/nginx/html | nginx默认的站点目录(404存在的地方),网站的根目录 |
/var/log/nginx | nginx日志文件 |
其他目录结构 | 详细说明 |
---|---|
/etc/logrotate.d/nginx | Nginx默认的日志切割 |
/usr/sbin/nginx-debug | Nginx命令行与终端调试工具 |
/etc/nginx/mime.types | Content-Type与扩展名 |
/etc/nginx/koi-win | Nginx编码转换映射文件 |
/etc/nginx/koi-utf | Nginx编码转换映射文件 |
/etc/nginx/win-utf | Nginx编码转换映射文件 |
/etc/nginx/uwsgi_params | uwsgi代理配置文件 |
/etc/nginx/scgi_params | scgi代理配置文件 |
/etc/nginx/fastcgi_params | Fastcgi代理配置文件 |
Nginx主配置文件讲解
# 核心模块
user nginx; # 启动nignx的用户
worker_processes auto; # nginxworker进程数 auto是根据服务器的cpu自行判断
error_log /var/log/nginx/error.log notice; # 错误日志的路径和文件名称
pid /var/run/nginx.pid; # nginx进程的pid信息
# 事件驱动模块
events {
worker_connections 1024;#每个worker进程支持的最大连接数
use epoll; #事件驱动模型, epoll默认
}
# HttpCoreModule(http内核模块)
http {
# 日志格式
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 /var/log/nginx/access.log main;
# 高效文件传输
sendfile on;
# 搭配sendfile一起使用
tcp_nopush on;
# 搭配sendfile一起使用
tcp_nodelay on;
# 长连接格式超时时间是65s
keepalive_timeout 65;
types_hash_max_size 4096;
# nginx引用媒体类型
include /etc/nginx/mime.types;
# 默认类型
default_type application/octet-stream;
# nignx网站相关配置文件的编写路径 和文件和格式
include /etc/nginx/conf.d/*.conf;
server {
listen 80; # nginx默认的端口 80
listen [::]:80;
server_name _; # 提供的域名
root /usr/share/nginx/html; # 站点目录 存放网站代码的目录
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
应用1:简单配置一个nginx网页
# 编辑nginx的配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/1.conf
server{
listen 80;
server_name www.hh.com;
root /code/h5_games;
index index.html;
}
#创建站点目录
[root@web01 ~]# mkdir /code
#准备索引文件
[root@web01 ~]# echo 123 > /code/index.html
[root@web01 code]# cat index.html
12
# 启动nginx
[root@web01 code]# systemctl restart nginx
#检查端口和进程还有服务是否启动
[root@web01 code]# systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2024-05-22 12:15:48 CST; 5h 41min ago
Docs: http://nginx.org/en/docs/
Process: 19765 ExecStop=/bin/sh -c /bin/kill -s TERM $(/bin/cat /var/run/nginx.pid) (code=exited, status=0/SUCCESS)
Process: 19769 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 19770 (nginx)
CGroup: /system.slice/nginx.service
├─19770 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─19771 nginx: worker process
May 22 12:15:48 web01 systemd[1]: Stopped nginx - high performance web server.
May 22 12:15:48 web01 systemd[1]: Starting nginx - high performance web server...
May 22 12:15:48 web01 systemd[1]: PID file /var/run/nginx.pid not readable (yet?) after start.
May 22 12:15:48 web01 systemd[1]: Started nginx - high performance web server.
[root@web01 code]# ps -ef|grep [n]ginx
root 19770 1 0 12:15 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 19771 19770 0 12:15 ? 00:00:00 nginx: worker process
[root@web01 code]# ss -lntup|grep [n]ginx
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=19771,fd=6),("nginx",pid=19770,fd=6))
#本地DNS
1.win + r
2.命令行输入drivers
3.打开目录 etc
4.编译hosts文件
5.添加一行 10.0.0.7 www.hh.com
应用2:简单搭建一个游戏网页和网站页面并加入日志文件
#安装nginx
yum installl -y nginx
# 编辑123网站配置文件
server{
listen 80;
server_name test.hh.com;
root /test1;
index index.html;
access_log /var/log/nginx/test1/test1_access.log main;
}
# 编辑小游戏配置网站
server{
listen 80;
server_name game.hh.com;
root /test2/h5_games;
index index.html;
access_log /var/log/nginx/test2/game_access.log main;
}
# 检测语法
nginx -t
# 创建日志存储路径
mkdir /var/log/nginx/test{1,2}
# 创建站点目录
[root@web01 conf.d]# mkdir /test1
[root@web01 conf.d]# mkdir /test2
# 准备第一个网站的索引文件
[root@web01 conf.d]# echo test > /test1/index.html
[root@web01 conf.d]# cat /test1/index.html
test
# 准备小游戏的代码
wget http://test.driverzeng.com/Nginx_Code/h5_games.zip
unzip h5_games.zip
# 启动nginx
systemctl start nginx
# 检查nginx进程 和 端口
[root@web01 test2]# ps -ef | grep [n]ginx
root 8079 8036 0 08:35 pts/1 00:00:00 vim /etc/nginx/nginx.conf
root 8157 1 0 08:43 ? 00:00:00 nginx: master process
/usr/sbin/nginx
nginx 8159 8157 0 08:43 ? 00:00:00 nginx: worker process
[root@web01 test2]# netstat -lntup | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
8157/nginx: master
tcp6 0 0 :::80 :::* LISTEN
8157/nginx: master
# 本地DNS域名解析
10.0.0.7 test.hh.com game.hh.com
# 访问网站
应用3:搭建wordpress
# 安装nginx和php
yum install -y php-rpm nginx
# 安装mariadb
yum install -y mariadb-server
# 编辑wordpress配置文件
server {
listen 80;
server_name wp.hh.com;
root /code/wordpress;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 准备网站代码
cd /code
wordpress-5.0.3-zh_CN.tar.gz
tar xf wordpress-5.0.3-zh_CN.tar.gz
# 重启nginx 和 php
systemctl restart nginx php-fpm
# 启动mariadb
systemctl start mariadb
# 确认端口
80
9000
3306
# 本地dns解析
10.0.0.7 wp.hh.com
虚拟主机
Nginx配置虚拟主机有如下三种方式:
方式一、基于主机多IP方式
方式二、基于多端口的配置方式
方式三、基于多个hosts名称方式*(多域名方式)*
1——多ip的虚拟主机方式
# 添加虚拟IP
ip addr add 10.0.0.11/24 dev eth0
ip addr add 10.0.0.12/24 dev eth0
# 查看ip(只能通过ip a查看 ,ifconfig看不到)
[root@web01 conf.d]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:a7:b8:91 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.7/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.0.0.11/24 scope global secondary eth0
valid_lft forever preferred_lft forever
inet 10.0.0.12/24 scope global secondary eth0
valid_lft forever preferred_lft forever
inet6 fe80::da50:51f5:4f61:1c0e/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::36c4:657d:1a01:aa11/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::2598:d9f2:e9e8:7810/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
# 编写基于ip访问的配置文件
[root@web01 conf.d]# cat 7.conf 11.conf 12.conf
server{
listen 80;
server_name 10.0.0.7;
root /7;
index index.html;
}
server{
listen 80;
server_name 10.0.0.11;
root /11;
index index.html;
}
server{
listen 80;
server_name 10.0.0.12;
root /12;
index index.html;
}
# 检测nginx语法
[root@web01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 准备站点目录
[root@web01 conf.d]# mkdir /7
[root@web01 conf.d]# mkdir /11
[root@web01 conf.d]# mkdir /12
[root@web01 ~]# ll /
total 20
drwxr-xr-x 2 root root 24 May 23 10:11 11
drwxr-xr-x 2 root root 24 May 23 10:12 12
drwxr-xr-x 2 root root 24 May 23 10:10 7
# 准备三个索引文件
[root@web01 conf.d]# echo 7 > /7/index.html
[root@web01 conf.d]# echo 11 > /11/index.html
[root@web01 conf.d]# echo 12 > /12/index.html
# 重启nginx
[root@web01 conf.d]# systemctl restart nginx
[root@web01 conf.d]# systemctl reload nginx
# 浏览器访问
10.0.0.7
10.0.0.11
10.0.0.12
2——基于多端口的配置方式
#编辑配置文件后查看
[root@web01 conf.d]# cat 7.conf 11.conf 12.conf
server{
listen 80;
server_name 10.0.0.7;
root /7;
index index.html;
}
server{
listen 90;
server_name 10.0.0.7;
root /11;
index index.html;
}
server{
listen 8090;
server_name 10.0.0.7;
root /12;
index index.html;
}
# 检测语法
nginx -t
# 重启nginx
systemctl restart nginx
# 检测端口
[root@web01 conf.d]# netstat -lntup | grep 80
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
20935/nginx: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
20935/nginx: master
[root@web01 conf.d]# netstat -lntup | grep 90
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
9028/php-fpm: maste
tcp 0 0 0.0.0.0:90 0.0.0.0:* LISTEN
20935/nginx: master
[root@web01 conf.d]# netstat -lntup | grep 8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
20935/nginx: master
# 修改索引文件
[root@web01 conf.d]# echo 90 > /11/index.html
[root@web01 conf.d]# echo 8080 > /12/index.html
# 浏览器访问
10.0.0.7
10.0.0.7:90
10.0.0.7:8080
# 注意点启动的端口范围1-65535
# 注意点 启动端口不要和本地现在启动的端口冲突
3——基于多域名
#编辑配置文件后查看
[root@web01 conf.d]# cat 7.conf 11.conf 12.conf
server{
listen 80;
server_name 1.hh.com;
root /7;
index index.html;
}
server{
listen 80;
server_name 2.hh.com;
root /11;
index index.html;
}
server{
listen 80;
server_name 3.hh.com;
root /12;
index index.html;
}
# 检测nginx语法
nginx -t
# 重启nginx
systemctl restart nginx
# 本地DNS解析
10.0.0.7 1.hh.com 2.hh.com 3.hh.com
nginx模块
nginx 目录索引模块
# 先准备nginx网页配置
[root@web01 conf.d]# vim /etc/nginx/conf.d/test.conf
server{
listen 80;
server_name 10.0.0.7;
root /test;
index index.html;
}
[root@web01 conf.d]# ll
total 28
-rw-r--r-- 1 root root 297 May 23 15:57 10.wp.conf
-rw-r--r-- 1 root root 103 May 23 10:44 11.conf
-rw-r--r-- 1 root root 103 May 23 10:43 12.conf
-rw-r--r-- 1 root root 116 May 22 12:48 1.conf
-rw-r--r-- 1 root root 102 May 23 10:44 7.conf
-rw-r--r-- 1 root root 1072 Apr 24 02:24 default.conf
-rw-r--r-- 1 root root 350 May 23 15:20 test.conf
# 创建站点目录
mkdir /test
# 准备索引文件
[root@web01 conf.d]# echo test > /test/index.html
[root@web01 conf.d]# cat /test/index.html
test
# 检测nginx语法
nginx -t
# 重启nginx
systemctl restart nginx
# 浏览器访问
10.0.0.7
配置目录索引模块 autoindex
- 当 ngx_http_index_module 模块找不到索引文件时,通常会将请求传递给 ngx_http_autoindex_module 模块。
Syntax: autoindex on | off;
Default:
autoindex off;
Context: http, server, location
# 修改配置文件 加上了autoindex模块
server{
listen 80;
server_name 10.0.0.7;
location / {
root /test;
index index.html;
autoindex on;
}
}
# 检查语法
nginx -t
# 重启nginx
systemctl restart nginx
# 找不到索引文件
# 在你的站点目录下不能有index.html
#模拟yum仓库加入bash和epel
[root@web01 ~]# ll /test
total 4
drwxr-xr-x 2 root root 6 May 23 11:52 bash
drwxr-xr-x 2 root root 6 May 23 11:52 epel
autoindex_exact_size on
Syntax: autoindex_exact_size on | off;
Default:
autoindex_exact_size on;
Context: http, server, location
off 显示文件的大概大小
on 显示文件的具体大小
# 编辑配置文件
server{
listen 80;
server_name 10.0.0.7;
location / {
root /test;
index index.html;
autoindex on;
autoindex_exact_size on | off; # 选择on或者off 以人类可读显示大小的是off,否则是on
}
}
页面显示格式 autoindex_format…
Syntax: autoindex_format html | xml | json | jsonp;
Default:
autoindex_format html;
Context: http, server, location
# 提供了html格式 xml格式 json格式 jsonp格式
# 修改配置文件
## xml
server{
listen 80;
server_name 10.0.0.7;
location / {
root /test;
index index.html;
autoindex on;
autoindex_exact_size on;
autoindex_format xml;
}
}
# 检测语法
nginx -t
# 重启nginx
systemctl restart nginx
# 访问页面
10.0.0.7
autoindex_localtime on
Syntax: autoindex_localtime on | off;
Default:
autoindex_localtime off;
Context: http, server, location
on 现实的是找点目录下文件的属性书剑
off 显示的是格林威治时间
# 编辑配置文件
server{
listen 80;
server_name 10.0.0.7;
location / {
root /test;
index index.html;
autoindex on;
autoindex_exact_size on;
autoindex_format html;
autoindex_localtime on | off;
}
}
# 检测语法
nginx -t
# 重启nginx
systemctl restart nginx
# 访问浏览器
10.0.0.7
配置nginx状态模块
server{
listen 80;
server_name 10.0.0.7;
location / {
root /test;
index index.html;
autoindex on;
autoindex_exact_size on;
autoindex_format html;
autoindex_localtime on;
}
location = /aaa {
stub_status;
}
}
# nginx检测语法
nginx -t
# 重启nginx
systemctl restart nginx
# 访问
10.0.0.7/aaa
Active connections: 2 # 当前活动的连接数
accepts # 当前总的连接数 tcp
handled # 成功的连接数数 4
requests # 总的http的请求书数目
4 4 51
Reading: 0 # 请求
Writing: 1 # 响应
Waiting: 1 # 等待的请求数
一次tcp请求里面 可以发起多次http的请求
keepalive_timeout 0; 关闭了长连接
keepalive_timeout 65; 65s内网页没有收到请求书就断开tcp连接
应用1:www用户统一化管理nginx和php
# 安装nginx和php
yum localinstall -y *.rpm ## yum install -y nginx php-fmp php-mysql
# 安装mariadb
yum install -y mariadb-server
# 编辑WeCenter_3-2-1配置文件
server {
listen 80;
server_name wc.com;
root /code/WeCenter_3-2-1;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 准备网站代码
cd /code
wget http://test.driverzeng.com/Nginx_Code/WeCenter_3-2-1.zip
tar xf WeCenter_3-2-1.zip
# 重启nginx 和 php
systemctl restart nginx php-fpm
# 启动mariadb
systemctl start mariadb
#⭐⭐⭐⭐⭐⭐⭐修改权限(如果报403错误,权限不足可能就是这里出问题 一定要-R,里面文件php编译的)
chown -R apache.apache WeCenter_3-2-1
# 确认端口
80
9000
3306
# 本地dns解析
10.0.0.7 wc.com
打开网页测试可以打开
#添加用户组
groupadd www -g 666
#添加用户
useradd www -u 666 -g 666 -M -s /sbin/nologin
#修改nginx和php-fpm配置文件 user改为www
[root@web01 ~]# vim /etc/nginx/nginx.conf
user www; ⭐⭐⭐⭐⭐⭐⭐⭐
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
; Start a new pool named 'www'.
[www]
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = www ⭐⭐⭐⭐⭐⭐⭐⭐
; RPM: Keep a group allowed to write in log dir.
group = www ⭐⭐⭐⭐⭐⭐⭐
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
; Set listen(2) backlog.
; Default Value: 511 (-1 on FreeBSD and OpenBSD)
;listen.backlog = 511
#再修改权限
chown -R www.www WeCenter_3-2-1