在《干货篇 | Nginx 我还真不信你学不会(上)》中,我们大概对Nginx有了一个大概印象:我们知道了Nginx是干什么用的、什么是反向代理和正向代理以及什么是负载均衡。
今天,我们来真正上手操作一下,俗话说“实践是检验真理的唯一标准”嘛,光听理论不上手操作,你永远也学不透。
关于Nginx的内容其实有很多,特别是模块部分的,如果我全部都列出来那5篇文章都写不完,所以我在这里给上Nginx官方文档链接,它里面有详细的教程。作为一名极客,我们要学会当遇到不懂的问题时去翻阅官网文档。
下面我将今天要讲的内容做了一个思维导图:
Nginx初体验
首先先打开我们的机器,以下是我的机器的配置:
系统:CentOS 7.6
处理器:1个
内存:1G
我们使用yum安装方式来安装Nginx
yum install -y nginx
安装完毕之后启动Nginx
systemctl start nginx
设置成开机自启动
systemctl enable nginx
关闭我们的防火墙和SELinux,不然等下访问不了我们的Nginx网站
#关闭防火墙
systemctl stop firewalld.service
#暂时关闭SELinux
setenforce 0
我们还可以进入到SELinux配置文件里面,对其进行永久关闭
vim /etc/selinux/config
其实启动Nginx还有另一种命令,是nginx自带的,建议使用nginx自带命令
nginx
启动完毕后我们访问一下,因为配置文件里已经指明默认端口为80,网址后面不写端口号也行,它访问的就是默认页面。
访问本机地址:80
相关配置文件
下面我们来看看nginx的一些配置文件
nginx主配置文件
/etc/nginx/nginx.conf
这个配置文件是存放了一下nginx相关基础配置,例如:默认端口、日志格式、默认网站,worker进程的管理用户等等
配置目录
/etc/nginx/conf.d/
这个是一个目录,里面通常是存放虚拟主机的一些配置,比如说我们要做一个博客网站和论坛网站,就可以分别定义这两个网站的配置文件,然后存放到这个目录下。就不用都把配置写进主配置文件里,显得更简洁美观
介绍完这两个,我们来看看主配置文件里面的具体内容
主配置文件里面其实还分为几个区域:main区域,event区域等
main区域:
主配置段,也就是全局配置段
cat /etc/nginx/nginx.conf
=====================第一个部分,配置文件的主区域======================
user nginx; # 定义worker进程的管理用户
worker_processes auto; # 定义worker进程数,auto会自动调整为cpu核数
worker_cpu_affinity auto [cpumask] #提高缓存命中率,将worker与cpu绑定
CPU MASK:00000001:第一个CPU
00000010:第二个CPU
worker_cpu_affinity 0001 0010 0100 1000;
worker_priority number
#指定worker进程的nice值,设定worker进程优先级: [-20,20](最大为19)
worker_rlimit_ nofile number #worker进程所能够打开的文件数量上限,如65535
error_log /var/log/nginx/error.log; # 定义错误日志
pid /run/nginx.pid; # 指定存储nginx主进程的PID文件路径
include /usr/share/nginx/modules/*.conf; #指明包含进来的其他配置文件片段
daemon on|off #是否以守护进程方式运行nginx
master_ process on|off #是否以master/worker模型运行nginx,默认为on
事件区域
事件驱动相关的配置
因为nginx是基于事件驱动架构,而且使用异步网络IO模型
...
events {
worker_connections 1024;
# 定义一个worker进程可以同时接受1024个请求
#总最大并发数: worker_processes * worker_ connections
use method #指明并发连接请求的处理方法,默认为epoll
use poll;
accept_mutex on|off
#处理新的连接请求的方法; on指由各个worker轮流处理新请求, Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成 “惊群”,影响性能
}
http区域
跟http协议有关的配置,里面还包括了server也就是虚拟主机的配置
...
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_CORK套接字
tcp_nodelay on; # 接连接保持活动状态
keepalive_timeout 65; # 超时时间
types_hash_max_size 2048;# 连接超时时间
include /etc/nginx/mime.types; # 文件扩展名与文件类型映射表
default_type application/octet-stream; # 默认文件类型,默认为text/plain
include /etc/nginx/conf.d/*.conf; #虚拟主机目录
server {
listen 80 default_server; # 指定监听的端口
listen [::]:80 default_server;
server_name _; # 指定网站主机名
root /usr/share/nginx/html; # 定义站点目录的位置
include /etc/nginx/default.d/*.conf; # 定义首页文件
location / {
}
error_page 404 /404.html; # 定义优雅显示页面信息
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
我们可以根据不同的需求来对配置文件进行修改,最好认真看一下上面的配置文件每个字段的具体意思,面试官有可能会问到哦
下面我们来讲讲nginx核心模块中的HTTP模块
模块介绍
在nginx的核心模块中,有这么一个模块,nginx的网站服务就是由它来具体实现的,它就是HTTP模块。
HTTP模块中又细分成好多个小的模块,分别实现不同的具体功能,比如说:重定向,访问控制,日志功能等
今天我们主要讲一下http模块中nginx_http_core_module模块
nginx_http_core_module
这个模块是用来配置虚拟主机的,下面是它的一个整体内容
server{
listen adress[:PORT]PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
比如说我们的这个虚拟主机监听的是80端口、主机名字叫www.a.com、网页所在路径为/data/web1,我们可以这样配置
server{
listen 80;
server_name www.a.com;
root /data/web1;
location / {
}
}
我们还可以设置默认监听端口,只需要在listen字段后面加上default_ server就行了,这样的话网址就是默认80端口
listen 80 default_ server;
我们还可以不同虚拟主机监听不同的端口
listen 80
listen 8080
listen 8888
还可以设置不同虚拟主机的ip地址
listen 192.168.1.1:80
listen 192.168.1.2:80
配置完监听端口之后,我们来配置主机名称
- 虚拟主机的主机名称后面可以跟多个由空白字符分隔的字符串
- 支持通配符
- 支持起始的字符做正则表达式模式匹配
比如说我们设置一个主机名为www.xxoo.com
server_name www.xxoo.com;
给它起两个名字也可以
server_name www.xxoo.com www.ooxx.com;
我们简单介绍一下名称匹配的优先级,等级是由高到低
(1) 首先是字符串精确匹配如: www.xxoo.com
(2) 左侧*通配符如: *.xxoo.com
(3) 右侧通配符如: www.xxoo.
(4) 正则表达式如: ~^.*\.xxoo.com$
(5) 默认主机 default_ server
我们接着讲一下跟路径相关的内容
- 用来设置网页资源、web资源的路径映射
- 用于指明请求的URL所对应的文档的目录路径
- 可以在http, server, location这些字段里面配置
比如说我们想用户输入www.xxoo.com 访问到的是我服务器的/www/html/目录
server{
server_name www.xxoo.com;
root /www/html;
}
http://www.xxoo.com/index.html ----> /www/html/index.html
我们其实还可以配置多个location来实现多个uri到文件系统的路径映射,ngnix会根据用户请求的URI来检查定义的所有location ,并找出一个最佳匹配
比如说我想用户输入www.xxoo.com/1.html时访问到的是我服务器上/www/html 目录下的1.html文件
server{
server_name www.xxoo.com;
root /www/html;
location / {
/www/html/;
}
}
http://www.xxoo.com/1.html ----> /www/html/1.html
或者想让用户输入www.xxoo.com/images/1.jpg时访问到的是我服务器上 /data/images 目录下的1.jpg文件
server{
server_name www.xxoo.com;
root /www/html;
location /images{
/data/images
}
}
http://www.xxoo.com/images ----> /data/images/1.jpg
除此之外,我们还可以使用路径别名
server{
listen 80;
server_name www.salted.com;
location /bbs/{
alias /web/forum/;
}
http: //www.salted.com/bbs/index.html ----> /web/forum/index.html
路径别名是文档映射的另一种机制,我们放在一起来对比一下
路径别名:
server{
listen 80;
server_name www.salted.com;
location /bbs/{
alias /web/forum/;
http://www.salted.com/bbs/index.html ----> /web/forum/index.html
路径映射
server{
listen 80;
server_name www.salted.com;
location /bbs/{
root /web/forum/;
}
http://www.salted.com/bbs/index.html ----> /web/forum/bbs/index.html
有时候访问网站出现错误时,一般的错误页面都不太友好。这时候我们可以定义错误页面。
server{
listen 80;
server_name www.salted.com;
error_page 404 /404.html;
location /404.html {
root /data/error/;
}
}
这样我们访问后如果碰到404错误的话就会显示出我们指定的错误页面。
此外我们还可以指定响应状态码,比如说我们访问网站遇到404错误,但是我们不希望返回给用户的状态码是404,我们可以指定其他状态码。这样的话返回给用户的是其他状态码,但是页面还是404页面
server{
listen 80;
server_name www.salted.com;
error_page 404=200 /404.htmL;
location /404.html {
root /data/error/;
}
}
其实在nginx_http_core_module中还有很多其他的配置字段,这里就不多详细介绍了,感兴趣的可以去访问Nginx的官网查看官方文档。文章开头已经附上了。
下面我们将真正开始搭建我们的虚拟主机(网站)
Nginx实操
首先搭建一个虚拟主机,这次案例我用到的机器是如下配置:
CentOS7.6
CPU:1个
内存:1G
本机ip地址:192.168.244.128
还记得我们上文讲到的通常用来存放模块的那个/etc/nginx/con.d/目录吗,我们需要将虚拟主机(网站)的配置文件放进里面,nginx启动或重启时会扫描里面的配置文件。
首先编写我们的网站相关配置
这个虚拟主机监听的是8080端口,网站域名为www.salted.com,访问到的网络资源在服务器的路径为/usr/share/nginx/html目录下
vim /etc/nginx/conf.d/www.conf
server {
listen 8080;
server_name www.xxoo.com;
location / {
root /usr/share/nginx/html;
index my_index.html;
}
}
每次修改完配置文件记得让nginx重启一下,如下命令可以让nginx平滑重启
nginx -s reload
接下来我们要编写我们的html文件
vim /usr/share/nginx/html/my_index.html
接下来我们编写hosts文件,实现域名解析。这样直接访问域名就能访问到网站了。
vim /etc/hosts
192.168.244.128 www.xxoo.com
如果想要在Windows上通过访问域名就能访问到网站的话,我们要在Windows上设置域名解析
Windows的hosts文件地址为:C:\Windows\System32\drivers\etc
接下来我们来验证一下
在linux系统上使用如下命令:
记得写上8080端口,不然访问的是默认页面
curl www.xxoo.com:8080
在Windows上直接输入ip地址或者域名
这样我们的第一个虚拟主机就配置完成了!
如果说我们想要访问多个资源的话,我们就要配置多个文件路径
server{
listen 8080 ;
server_name www.xxoo.com;
root /usr/share/nginx/html;
location / {
index my_index.html;
}
location /data {
root /web/;
}
location /web/images {
root /web/;
}
}
别忘了每次更新完配置文件都要重启一下
nginx -s reload
接下来创建我们存放文件的相关目录并分别写入内容
mkdir -pv /web/{data,images}
echo "this is /web/data" > /web/data/index.html
echo "this is /web/images" > /web/images/index.html```
我们访问来验证一下:
比如说我们访问一个不存在的网页,
像www.xxoo.com:8080/xxoo/index.html
就会显示如下错误页面
这个页面其实不太友好,我们可以自定义一个错误页面
server{
listen 8080 ;
server_name www.xxoo.com;
root /usr/share/nginx/html;
error_page 404 /404.html;
location / {
index my_index.html;
}
location /data {
root /web/;
}
location /images {
root /web/;
}
location /404.html {
root /web/pages/;
}
}```
创建存放错误页面的目录
mkdir /web/pages
创建错误页面
vim /web/pages/404.html
<h1>
this is 404 error!
</h1>```
验证如下
最后,我们再来讲下如何配置多个虚拟主机
首先在/etc/nginx/con.d/目录下创建我们的各个虚拟主机配置文件并配置好
touch /etc/nginx/conf.d/{bbs,blog,www}.conf
#第一个虚拟主机
vim /etc/nginx/conf.d/bbs.conf
server {
listen 8080;
server_name bbs.com;
location / {
root /html/bbs;
index index.html;
}
}
#第二个虚拟主机
vim /etc/nginx/conf.d/blog.conf
server {
listen 8080;
server_name blog.com;
location / {
root /html/blog;
index index.html;
}
}
#第三个虚拟主机
vim /etc/nginx/conf.d/www.conf
server {
listen 8080;
server_name www.com;
location / {
root /html/www;
index index.html;
}
}
准备存放网络资源的目录
mkdir -p /html/{www,bbs,blog}
for name in {www,bbs,blog};do echo "<h1> $name </h1>" >
/html/$name/index.html;done;;
添加域名解析
vim /etc/hosts
192.168.33.133 www.eagle.com bbs.eagle.com blog.eagle.com
更新配置文件后平滑重启
nginx -s reload
最后验证
curl www.com:8080
<h1> www </h1>
curl bbs.com:8080
<h1> bbs </h1>
curl blog.com:8080
<h1> blog </h1>