我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。

个人博客:传送阵

笔者微信:zhanghe15069028807,非诚勿扰。

一、安装配置

1、安装

不要安装epel,因为配置文件比较乱,用官方的,配置文件简单
http://nginx.org/en/linux_packages.html#RHEL-CentOS
[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-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true yum install nginx 发现源是从nginx过来的,700多K的,源很重要。
[root@web01 tmp]# rpm -ql nginx
/etc/logrotate.d/nginx 日志切割 /etc/nginx #这三行都是配置文件文件,defaut.conf里面有一个include
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf /etc/nginx/fastcgi_params
/etc/nginx/koi-utf
/etc/nginx/koi-win /etc/nginx/mime.types #格式关系对应表
/etc/nginx/modules #模块
/etc/nginx/nginx.conf #主配置文件
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/etc/nginx/win-utf
/etc/sysconfig/nginx #存放的是参数
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service #启动的服务名
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html #默认页面
/var/cache/nginx
/var/log/nginx #日志

上面这是nginx官方安装编译好的,我们可以查看其安装编译的参数:

[root@web01 ~]# nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments:
--prefix=/etc/nginx #安装的路径
--sbin-path=/usr/sbin/nginx #命令的路径
--modules-path=/usr/lib64/nginx/modules #模块的路径
--conf-path=/etc/nginx/nginx.conf #配置文件的路径
--error-log-path=/var/log/nginx/error.log #错误日志
--http-log-path=/var/log/nginx/access.log #正常日志
--pid-path=/var/run/nginx.pid #进程号
--lock-path=/var/run/nginx.lock #锁文件,防止反复重启 --http-client-body-temp-path=/var/cache/nginx/client_temp 客户端内容临时存放的路径
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx #nginx运行的用户和组 --with-compat #with开头的都是模块
--with-file-aio
--with-threads
--with-http_addition_module
--with-http_auth_request_module
--with-http_dav_module
--with-http_flv_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_mp4_module
--with-http_random_index_module
--with-http_realip_module
--with-http_secure_link_module
--with-http_slice_module
--with-http_ssl_module #ssl模块
--with-http_stub_status_module #状态码模块
--with-http_sub_module
--with-http_v2_module #支持go语言代理
--with-mail
--with-mail_ssl_module
--with-stream #stream用来做四层的负载均衡
--with-stream_realip_module
--with-stream_ssl_module
--with-stream_ssl_preread_module
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

如果想看公司的nginx编译参数,-V看一下,直接复制去编译就行。

2、配置文件

/etc/nginx/nginx.conf是主配置文件,里面有一个包括,这个包括把/etc/nginx/conf.d里面的所有以.conf结尾的文件 ,默认里面就有一个default.conf

[root@web01 nginx]# cat nginx.conf
user nginx; #启动的用户
worker_processes 1; #进程的数量
error_log /var/log/nginx/error.log warn; #错误日志的路径
pid /var/run/nginx.pid; #进程运行后,存放进程ID的文件
####################上面是核心模块,下面是事件层
events {
worker_connections 1024; #每一个worker进程最大支持的连接数
use epool; #使用的网络模型select,pool,epool,默认是epool层
}
#####################下面是http模块层
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;
keepalive_timeout 65; #长连接时间,0就变成了短连接了
#gzip on; include /etc/nginx/conf.d/*.conf; #包括
}
[root@web01 conf.d]# cat default.conf
server { #放到http层,定义具体的网站
listen 80;
server_name localhost; #域名或主机名
location / { #一个server里面可以出现多个location
root /usr/share/nginx/html; #这是个目录,默认去到根目录
index index.html index.htm; #默认请求的主页面
}
}

3、测试和启动

[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]# systemctl start nginx #
//路径匹配,一个server层里面可以出现多个location
[root@web01 conf.d]# cat default.conf
server {
listen 80;
server_name localhost; location / { #定义一个网站
root /usr/share/nginx/html;
index index.html index.htm;
} location /test { #用户这样访问IP/test才能访问到oldboy.html,IP后面是根,而这里的根指的是/opt,/opt/下面的test目录
root /opt/;
index oldboy.html;
}
}

关系

http层下允许有多个server层,一个server层下又允许有多个location

http{}标签主要用来解决用户请求和响应

server标签主要用来响应具体的某一个网站

location标签主要用于匹配网站的具体URL路径

二、功能

1、虚拟主机

1.1 基于IP

[root@nginx bbs]# cd /etc/nginx/conf.d
[root@nginx conf.d]# ls
bbs.zhanghe.conf www.zhanghe.conf
[root@nginx conf.d]# cat www.zhanghe.conf
server {
listen 192.168.80.2:80;
server_name www.zhanghe.com; location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@nginx conf.d]# cat bbs.zhanghe.conf
server {
listen 192.168.80.5:80;
server_name www.zhanghe.com; location / {
root /www/web/bbs;
index index.html index.htm;
}
}

1.2 基于域名

[root@nginx conf.d]# ls
bbs.zhanghe.conf www.zhanghe.conf
[root@nginx conf.d]# cat www.zhanghe.conf
server {
listen 192.168.80.2:80;
server_name www.zhanghe.com; location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@nginx conf.d]# cat bbs.zhanghe.conf
server {
listen 192.168.80.2:80;
server_name bbs.zhanghe.com; location / {
root /www/web/bbs;
index index.html index.htm;
}
}

1.3 基于端口

[root@nginx conf.d]# ls
bbs.zhanghe.conf www.zhanghe.conf
[root@nginx conf.d]# cat www.zhanghe.conf
server {
listen 192.168.80.2:80;
server_name www.zhanghe.com; location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
[root@nginx conf.d]# cat bbs.zhanghe.conf
server {
listen 192.168.80.2:8080;
server_name www.zhanghe.com; location / {
root /www/web/bbs;
index index.html index.htm;
}
}

2、访问控制

访问控制就是可以允许哪些IP地址来访问location站点,不允许哪些IP地址来访问location站点,举个例子:

[root@nginx conf.d]# cat default.conf
server {
listen 80;
server_name localhost; location / {
root /usr/share/nginx/html;
index index.html index.htm;
} location /test { #对这个站点做了访问控制
root /www/web/bbs;
index index.html index.htm;
deny 192.168.80.6; #80.6这台主机访问时就会报4.3错误
allow all;
}
}

3、用户认证

用户认证就是访问网站时会弹出一个框来让你输入用户名和密码,只有输入正确了才能查看页面,很少用这种方式,会用即可。

//准备一个目录用来存放用户名和密码
yum -y install httpd-tools
[root@nginx ~]# mkdir /etc/nginx/conf
[root@nginx ~]# cd /etc/nginx/conf
[root@nginx conf]# htpasswd -bc htpasswd zhanghe cba-123 #bc的意思无需关心,记住格式即可。
Adding password for user zhanghe #注意密码文件的权限和属主和属组 //把用户文件的路径写上
[root@nginx conf]# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost; location / {
root /usr/share/nginx/html;
index index.html index.htm;
} location /test {
root /www/web/bbs;
index index.html index.htm;
auth_basic "closed site"; #引号里面的名字随便写
auth_basic_user_file conf/htpasswd; #这里是相对路径,相对于/etc/nginx,与上文响应
}
}

4、文件共享

[root@web01 conf.d]# cat game.oldboy.conf
server{
listen 80;
server_name game.oldboy.com; location / {
root /code;
index index.html;
autoindex on; #加上一行即可
}

注意,有时不生产,把默认的index.html注释掉即可,如果还这样,就把index.html更名。

在浏览器上打开文件,有的直接打开,而有的会下载,nginx是根据扩展名来判断的,我们可以根据/etc/mime.types文件来进行控制,这个文件叫媒体资源类型,默认txt的扩展名被识别为文本,所以能够在浏览器中直接打开,而不是下载,假如我们想php文件也当成是文件直接打开,就在该文件的txt后加上php,如下所示:

vim /etc/mime.types
text/plain txt; #默认是这样
text/plain txt php; #变成了这样,重启nginx,php文件也能当成文本文件直接打开了

浏览器默认访问索引时把中文显示为了乱码,怎么解决呢?

[root@nginx test]# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost; location / {
root /usr/share/nginx/html;
index index.html index.htm;
autoindex on;
} location /test {
root /www/web/bbs;
index 123.jkk;
autoindex on;
charset utf-8; #加上这一行即可
}
}

5、文件别名

为什么用别名呢?

方便测试,用短的域名测试,方便书写,代码上线的时候方便标记

[root@nginx conf.d]# cat default.conf
server {
listen 80;
server_name www.zhanghe.com a.com; #加一个别名a.com location / {
root /usr/share/nginx/html;
index index.html index.htm;
autoindex on;
} }

在windows上修改hosts文件之后,用a.com访问比写一长串www.zhanghe.com要快好多。

6、状态模块监控

[root@nginx conf.d]# vim state.conf
server {
listen 80;
server_name state.zhanghe.com;
stub_status; }

在windows上访问state zhanghe.com就可以看到状态页面,别忘记重写hosts文件。

Active connections:当前在多少个用户连接,可以通过zabbix监控在这,达到一定数量就会报警。

accepts:接收的连接数汇总(综合) tcp,nginx服务重启就会清零。

handied:处理的连接数汇总(综合) TCP,通常和上面的相等,有时也有例外,比如资源限制服务器不处理,那就不相等了。·

requests:总计的请求数量 HTP协议请求,一次连接可以有多次请求,这里体现了长短连接。

Reading: nginx:正在读取的请求报文,一共是0,并发大的时候才会体现。

writing: nginx:正在读取的响应报文,一共是0,并发大的时候才会体现。

waiting: nginx:nginx忙不过的时候,请求报文和响应报文要排除,这里会体现队列的长度,这里也可以通过zabbix监控,看排除的人多不多,如果太多了,及时调整。

7、日志

nginx有两个日志比较重要,如下:

[root@nginx nginx]# pwd
/var/log/nginx
[root@nginx nginx]# ls
access.log error.log

7.1 错误日志

错误日志的路径和级别的设置在/etc/nginx/nginx.conf文件里面,如下所示:

[root@nginx ~]# grep error /etc/nginx/nginx.conf
error_log /var/log/nginx/error.log warn; #格式:路径,级别

错误日志级别

级别设置的越低,错误日志里面产生的信息也就越多,比如你设置的是debug这种的,那鸡毛蒜皮的小事都会记录到日志里面,如果设置的级别高一些,就会记录此级别以及此级别之上级别的信息,如果设置看自己的磁盘大小,如果自己的磁盘空间很充足,可以设置低一些,如果磁盘空间不太充足,就可以只记录关键的信息,节省点空间,默认是warn级别,如下所示,当然我们可以更改,一般更改成error级别,在此级别上只记录错误信息,方便我们排错。

7.2 访问日志

访问日志的路径和级别的设置在/etc/nginx/nginx.conf里面,如下所示:

//访问日志整体分为两个部分,定义格式log_format,然后起一个名字,最后调用这个格式
[root@nginx ~]# sed -n '18,+4p' /etc/nginx/nginx.conf
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;

'$remote_addr 客户端的IP

$remote_user 通过认证的用户

[$time_local] 客户端访问网站的时间

"$request" ' 用户请求头部:用户请求的方法,http协议的版本

'$status 用户访问网站的状态码

$body_bytes_sent 服务器给客户端回复的流量大小,默认是字节,可通过awk做求和运算,看流量,来确定我们买带宽买多大的合适。

"$http_referer" ' 从哪里面跳转过来的(防止盗链)

'"$http_user_agent" 通过什么浏览器过来的

"$http_x_forwarded_for"'; 负载均衡相关的,我们在负载均衡的章节为讲一下

7.3 错误界面优雅显示

可以用来做什么事情呢?比如错误页面优雅显示。

[root@nginx ~]# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name www.zhanghe.com a.com; location / {
root /usr/share/nginx/html;
index index.html index.htm;
autoindex on;
}
location /test {
root /www/;
error_page 404 = 123.jpg; #通过123.jpg覆盖404界面,123.jpg存放在/www/test里面
}
}

7.4 服务匹配

这个功能用的比较少,知道即可。

就是通过匹配某个URL,返回特定的界面,我们举个例子:

[root@nginx conf.d]# cat test.conf
server {
listen 80;
server_name www.123.com; location = / { #默认,即输入www.123.com或www.123.com/,精确匹配到这里。
return 404;
}
location / { #输入www.123.com之后乱输入,比如www.123.com/kjdfkjdkfjkd
return 403;
}
location /doc { #输入的路径中带有doc,比如www.123.com/doc/kdjfjdfj
return 402;
}
location ^~ /images { #输入的路径中带有doc,比如www.123.com/images/kdjfjdfj
return 405;
}
location ~* \.(jpg|jpeg)$ { #不区分大小与,比如www.123/kdfjkldfj/djfkj.jgp
return 501;
}
}

7.5 跳转

跳转功能就是我们上百度的时候,不用输入www.baidu.com,只需要输入baidu.com即可,浏览器会自动跳转到www.baidu.com上。

[root@nginx conf.d]# vim default.conf 

server {
listen 80;
server_name www.zhanghe.com zhanghe.com; #这里有一个别名
rewrite ^/(.*) www.zhanghe.com/$1 permanent; #permanent永久跳转301 location / {
root /usr/share/nginx/html;
index index.html index.htm;
autoindex on;
}
location /test {
root /www/;
error_page 404 = 123.jpg;
}
}

效果就是当我们curl zhanghe.com/test自然会跳转到www.zhanghe.com/test

permanent 301 永久跳转

redirect 302 临时跳转

[root@tomcat02 ~]# curl zhanghe.com/test
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>
//出现了坑,传递的参数超过nginx 服务器的限制
[root@tomcat02 ~]# curl -L www.zhanghe.com #-L跟着跳转走,还是出了错误
<html>
<head><title>414 Request-URI Too Large</title></head>
<body>
<center><h1>414 Request-URI Too Large</h1></center> //解决办法 在/etc/nginx/nginx.conf里面加两行
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
//又出现了坑,逻辑次数,跳转次数过多,排除curl -Lv 看过程,发现一直跳转,问题出在rewrite的位置上
[root@tomcat02 ~]# curl -L www.zhanghe.com
curl: (47) Maximum (50) redirects followed

怎么办呢?调整rewrite的位置,如下所示,再加一个server:

[root@nginx ~]# vim /etc/nginx/conf.d/default.conf 

server {                         #这样即打破循环
listen 80;
server_name zhanghe.com;
rewrite ^/(.*) http://www.zhanghe.com/$1 permanent;
} server {
listen 80;
server_name www.zhanghe.com; location / {
root /usr/share/nginx/html;
index index.html index.htm;
autoindex on;
}
location /test {
root /www/;
index index.html index.htm;
error_page 404 = 123.jpg;
}
}

nginx(4)的更多相关文章

  1. 深度优化LNMP之Nginx (转)

    深度优化LNMP之Nginx Nginx基本安全优化 1.调整参数隐藏Nginx版本号信息     一般来说,软件的漏洞都和版本有关,因此我们应尽量隐藏或清除Web服务队访问的用户显示各类敏感信息(例 ...

  2. 我眼中的 Nginx(六):深入 Nginx/Openresty 服务里的 DNS 解析

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...

  3. 我眼中的 Nginx(五):Nginx — 子请求设计之道

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...

  4. 我眼中的 Nginx(四):是什么让你的 Nginx 服务退出这么慢?

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...

  5. 我眼中的 Nginx(三):Nginx 变量和变量插值

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...

  6. 我眼中的 Nginx(二):HTTP/2 dynamic table size update

    张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...

  7. 用lua扩展你的Nginx(整理)-----openresty

    用lua扩展你的Nginx(整理) 首先得声明.这不是我的原创,是在网上搜索到的一篇文章,原著是谁也搞不清楚了.按风格应该是属于章亦春的文章. 整理花了不少时间,所以就暂写成原创吧. 一. 概述 Ng ...

  8. Zabbix 监控 Nginx(四)

    简介: 如何使用 Zabbix 监控 Nginx 状态 ? 1.获取 Nginx 状态( HTTP Stub Status ) [root@localhost ~]# /apps/product/ng ...

  9. nginx(一)

    crul新浪微博的时候发现对面用的是nginx服务器,在虎扑足球(挺好的足球论坛)讨论世界杯也发现他们也用这nginx,联想到阿里的tengine也是基于nginx的,觉得有了解一下nginx的必要了 ...

  10. LINUX测试环境部署nginx(五)

    安装配置nginx 安装编译环境:yum -y install pcre-devel openssl openssl-devel 拷贝nginx压缩文件到目标目录后,解压tar -zxvf nginx ...

随机推荐

  1. mui 顶部选项卡的两种切换方式

    mui 顶部选项卡的两种切换方式 第一种main页面 <!DOCTYPE html> <html> <head> <meta charset="ut ...

  2. ARTS-S docker ceontos镜像中使用crontab

    centos镜像中默认没有crontab,需要在dockerflle中通过yum的安装 yum -y install vixie-cron crontabs && yum clean ...

  3. HtmlAgilityPack 获取节点的子节点

    这个问题真的是好无语 var table = doc.DocumentNode.SelectSingleNode("//table[@class='ddd']"); var a = ...

  4. 【React】在React中 JSX 代码如何转成 JS 代码?

    一.介绍 写 React 代码的朋友应该都是直接写 JSX 代码,JSX 让我们可以在 JS 中直接写 HTML 代码,可阅读性较高.本章节主要介绍 JSX 通过 babel 转换后会生成什么样式代码 ...

  5. Java中通过代码得到int类型数值的二进制形式

    一.完整代码 public class BigInteger { int sing; byte[] val; public BigInteger(int val){ // 将传递的初始值,按位取值,存 ...

  6. unittest自动化测试框架

    目录 框架的概念 Unittest单元测试框架 常用的assert语句 unittest创建测试代码的方式: unittest构建测试套件(测试用例集合): unittest忽略测试用例: 运行测试集 ...

  7. 布隆过滤器的demo

    /** * 缓存击穿 * @author * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = ...

  8. 大数据学习笔记——Linux完整部署篇(实操部分)

    Linux环境搭建完整操作流程(包含mysql的安装步骤) 从现在开始,就正式进入到大数据学习的前置工作了,即Linux的学习以及安装,作为运行大数据框架的基础环境,Linux操作系统的重要性自然不言 ...

  9. linux,centos,php,word转图片方法

    刚开始的时候是客户的活儿,真的是没有想到,被这样一个方法给卡住了,真是醉了,经过漫长的一周,终于搞定了这个问题,以下就来给大家介绍以下这个方法把.能方便大家. (直接转换没办法,所以找了个折中的办法, ...

  10. 云服务器配置 docker java mysql mongodb redis nginx 环境

    磁盘挂载 fdisk -l #查看磁盘列表 mkfs.ext4 /dev/vdb #格式化磁盘 mount /dev/vdb /data #挂载磁盘在/data echo '/dev/vdb /dat ...