nginx源码编译及优化

这篇博客对比了Apache和nginx的区别,重点讨论了nginx的反向代理能力及其在负载均衡中的应用。内容包括nginx的源码编译、优化技巧,以及如何设置健康检查。此外,还阐述了nginx在提升网站性能方面的角色,如CDN加速和负载均衡策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Apache与nginx的区别

apache

  1. 进程,稳定
  2. 模块超多,基本想到的都可以找到
  3. 少bug ,nginx 的bug 相对较多

nginx

  1. 线程,快,不稳定。多线程是共享的,一个线程出问题,其他的也会受牵连。
  2. 7层调度,反向代理能力强。CDN这块nginx也用的多
  3. 轻量级,同样起web 服务,比apache占用更少的内存及资源
  4. 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  5. 高度模块化的设计,编写模块相对简单
  6. 社区活跃,各种高性能模块出品迅速啊
  7. 自带健康检查

反向代理

正向代理:服务器不知道用户是谁
用浏览器访问 http://www.google.com 时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。
A同学去找马云爸爸借钱,马云没有借,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。
反向代理:用户不知道服务器是谁
反向代理一般部署在中心机房,用户首先访问的是反向代理服务器,再由反向代理服务器请求真正的服务器。获得结果后将结果返回给用户。同时会将次内容缓存,当其他用户再次访问时,就可以命中
缓存,直接将结果返回给用户,就不会请求真实服务器。提高相应速度。
1.拿10086来说,当你想要人工办理移动业务时,拨打10086(10086这个号码就相当于反向代理服务器),进行业务的过滤分类后,你将被分配到真正主管该业务的话务员(相当于真正的服务器)
2.cdn主要解决地理距离上造成的访问延迟高的情况。一般部署在网络提供商的机房。
通常情况下,当访问大型企业时,由于客户所在地址离企业的服务器的距离不同,有些客户距离比较近,有些客户距离比较远,那么距离远的客户访问企业服务器时,客户端数据会经过层层路由,最终访问企业服务器的延时就会相当高,这无疑拉低用户体验。
所以企业一般会在不同地方租用一个服务器来当时缓存企业服务器上的内容,当用户访问企业服务器时,会首先访问企业租用的距离用户较近的这台服务器上的缓存,当租用的服务器上有用户所需的信
息,直接返回数据,达到加速的目的,这就是通常所说的cnd加速。

nginx源码编译

rewrite ,比nginx 的rewrite 强大

动态页面
模块超多,基本想到的都可以找到
少bug ,nginx 的bug 相对较多

超稳定

先关闭集群避免影响

[root@server1 ~]# pcs cluster stop --all
server2: Stopping Cluster (pacemaker)...
server1: Stopping Cluster (pacemaker)...
server1: Stopping Cluster (corosync)...
server2: Stopping Cluster (corosync)...
[root@server1 ~]# pcs cluster disable --all
server1: Cluster Disabled
server2: Cluster Disabled
[root@server2 ~]# ls
nginx-1.18.0.tar.gz
[root@server2 ~]# tar zxf nginx-1.18.0.tar.gz 
[root@server2 ~]# ls
nginx-1.18.0  nginx-1.18.0.tar.gz
[root@server2 ~]# cd nginx-1.18.0/
[root@server2 nginx-1.18.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
[root@server2 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module    #  ssh用的ssl协议     --prefix默认安装目录
checking for OS
 + Linux 3.10.0-957.el7.x86_64 x86_64
checking for C compiler ... not found

错误一:./configure: error: C compiler cc is not found   #缺少gcc编译器

[root@server2 nginx-1.18.0]# yum install -y gcc 

错误二:./configure: error: the HTTP rewrite module requires the PCRE library.  #缺少pcre库 ##缺少什么库一般在后面加个-devel

[root@server2 nginx-1.18.0]# yum install -y pcre-devel

错误三:./configure: error: SSL modules require the OpenSSL library.

[root@server2 nginx-1.18.0]# yum install -y openssl-devel

[root@server2 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module


Configuration summary
  + using system PCRE library
  + using system OpenSSL library
  + using system zlib library        # zlib 是ssl的依赖 用来压缩
[root@server2 nginx-1.18.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
[root@server2 nginx-1.18.0]# ll Makefile # 记录编译时指定的参数,加的模块
-rw-r--r-- 1 root root 376 Aug  8 13:48 Makefile
[root@server2 nginx-1.18.0]# make  #编译是在当前目录中把源码编译成二进制程序
[root@server2 nginx-1.18.0]# make install   # copy二进制程序到指定的目录
[root@server2 nginx-1.18.0]# du -sh
27M	.
[root@server2 nginx-1.18.0]# du -h /root/nginx-1.18.0.tar.gz 
1016K	/root/nginx-1.18.0.tar.gz
[root@server2 nginx-1.18.0]# cd /usr/local/nginx/
[root@server2 nginx]# ls
conf  html  logs  sbin
[root@server2 nginx]# du -sh
5.8M	.
[root@server2 nginx]# cd sbin/
[root@server2 sbin]# ls
nginx
[root@server2 sbin]# ./nginx -v
nginx version: nginx/1.18.0
[root@server2 sbin]# ./nginx
[root@server2 sbin]# netstat -antlp|grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      12228/nginx: master 
tcp6       0      0 :::8000                 :::*                    LISTEN      3178/httpd       

nginx优化

[root@server2 ~]# cd nginx-1.18.0/
[root@server2 nginx-1.18.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
[root@server2 nginx-1.18.0]# cd auto/
[root@server2 auto]# ls
cc          feature       headers  install  module   options  stubs    types
define      have          include  lib      modules  os       summary  unix
endianness  have_headers  init     make     nohave   sources  threads
[root@server2 auto]# cd cc
[root@server2 cc]# ls
acc  bcc  ccc  clang  conf  gcc  icc  msvc  name  owc  sunc
[root@server2 cc]# vim gcc
# debug
#CFLAGS="$CFLAGS -g"    #注释掉,我们不需要debug,有debug会占内存更大

[root@server2 cc]# cd 
[root@server2 ~]# cd nginx-1.18.0/
[root@server2 nginx-1.18.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
[root@server2 nginx-1.18.0]# cd src/
[root@server2 src]# ls
core  event  http  mail  misc  os  stream
[root@server2 src]# cd core/      
[root@server2 core]# vim nginx.h 

#define NGINX_VER          "nginx/"       # 删除版本号,安全
[root@foundation4 ~]# curl -I www.jd.com
HTTP/1.1 302 Moved Temporarily
Server: nginx      # 没有显示版本号
Date: Thu, 13 Aug 2020 06:00:22 GMT
Content-Type: text/html
Content-Length: 138
Connection: keep-alive
Location: https://www.jd.com/
Access-Control-Allow-Origin: *
Timing-Allow-Origin: *
X-Trace: 302-1597298422195-0-0-0-0-0
Strict-Transport-Security: max-age=360

设置成systemd启动方式

[root@server2 ~]# cd /usr/lib/
[root@server2 lib]# ll -d /lib
lrwxrwxrwx. 1 root root 7 Aug  4 11:28 /lib -> usr/lib
[root@server2 lib]# cd systemd/
[root@server2 systemd]# cd system
[root@server2 system]# vim nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
[root@server2 logs]# killall nginx
[root@server2 logs]# systemctl  start nginx
[root@server2 logs]# pwd
/usr/local/nginx/logs
[root@server2 logs]# ls
access.log  error.log  nginx.pid
[root@server2 logs]# systemctl daemon-reload    #刷新

nginx实现负载均衡

[root@server2 logs]# cd ..
[root@server2 nginx]# ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
[root@server2 nginx]# cd conf/
[root@server2 conf]# ls
fastcgi.conf            koi-utf             nginx.conf           uwsgi_params
fastcgi.conf.default    koi-win             nginx.conf.default   uwsgi_params.default
fastcgi_params          mime.types          scgi_params          win-utf
fastcgi_params.default  mime.types.default  scgi_params.default
[root@server2 conf]# ll nginx.conf      # nginx主配置文件
-rw-r--r-- 1 root root 2656 Aug  8 13:53 nginx.conf
[root@server2 conf]# vim nginx.conf 

#user  nobody;               # 默认情况下这个程序以nobody的身份执行
worker_processes  1;      # worker数量和cpu核心数量相同,不知道可以设置成auto


[root@server2 conf]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
[root@server2 conf]# vim nginx.conf 

 12 events {          #时间
 13     worker_connections  65535;       # 每个worker并发连接数   #应用
 14 }

kernel > systemctl > app
应用的最大连接数肯定不会大于系统和内核的,写的比系统大了也没用,内核和系统的最大连接数就是限制。内核的最大连接数和内存有关,无法更改

[root@server2 conf]# sysctl -a|grep file    # 内核
fs.file-max = 97765
fs.file-nr = 1312	0	97765
fs.xfs.filestream_centisecs = 3000
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"

[root@server2 conf]# useradd -M -d /use/local/nginx -s /sbin/nologin nginx
## -M:不创建用户的家目录 -d 指定家目录  -s : 登陆的shell
[root@server2 conf]# vim /etc/security/limits.conf  #系统
## 热插拔模块,即改即生效

nginx   -       nofile          65535      ## - 软线和硬线都一样

nginx的负载均衡是通过反向代理实现的

[root@server2 conf]# vim nginx.conf
##定义:

http {			#超文本传输协议
        upstream westos{
        server 172.25.4.3;      ## 支持端口映射,不设置默认80
        server 172.25.4.4;
        }

    include       mime.types;
    default_type  application/octet-stream; 
## 通过uptream定义一个名为westos的负载均衡器,在负载均衡器里有两个RS

使用:

 40 
 41     server {            #一个server语句块就是一个虚拟主机,针对www.westos.org
 42         listen       80;
 43         server_name  www.westos.org;    # 负载均衡可能针对某一个域名
 44 
 45         #charset koi8-r;
 46 
 47         #access_log  logs/host.access.log  main;
 48 
 49         location / {
 50             proxy_pass http://westos;       #负载均衡
 51             index  index.html index.htm;
 52         }
 53 

[root@server2 conf]# systemctl reload nginx

测试:

[root@server1 ~]# curl 172.25.4.2
vm4
[root@server1 ~]# curl 172.25.4.2
vm3
[root@server1 ~]# curl 172.25.4.2
vm4
[root@server1 ~]# curl 172.25.4.2
vm3


[root@server1 ~]# vim /etc/hosts

172.25.4.2      server2   www.westos.org

[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm3
[root@server2 conf]# vim nginx.conf

 20         server 172.25.4.3 weight=2;       # 权重

[root@server2 conf]# systemctl reload nginx

测试:

[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm4

hash函数

[root@server2 conf]# vim nginx.conf


 17 http { 
 18 
 19         upstream westos{
 20         ip_hash;         # hash函数,定向到一个server
 21         server 172.25.4.3;
 22         server 172.25.4.4;
 23         }
 
[root@server2 conf]# systemctl reload nginx

测试:

[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3

nginx自带健康检查

[root@server3 ~]# systemctl stop httpd     
## server3关闭http服务,nginx检测到就不会分配给server3了

测试:

[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm4
[root@server1 ~]# curl www.westos.org
vm4
[root@server3 ~]# systemctl start httpd
## 启动server3就会再次加入到调度列表
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3
[root@server1 ~]# curl www.westos.org
vm3

nginx应用

[root@server2 conf]# mkdir /www1
[root@server2 conf]# echo www1 >  /www1/index.html
[root@server2 conf]# mkdir /www2
[root@server2 conf]# echo www2 >  /www2/index.html
[root@server2 conf]# vim nginx.conf

    server {
        listen       80;
        server_name  www1.westos.org;         # 访问哪个域名就调度哪个模块
        location / {        # location:定位数据目录
                root /www1;
                index index.html;
        }
}

    server {
        listen       80;
        server_name  www2.westos.org;

        location / {
                root /www2;
                index index.html;
        }
	}
}

[root@server2 conf]# systemctl reload nginx
[root@foundation4 ~]# vim /etc/hosts

172.25.4.2      server2   www1.westos.org www2.westos.org www.westos.org

网页测试:

www1.westos.org 
www2.westos.org 
www.westos.org            #负载均衡
访问哪个域名就调用哪个模块
[root@server2 conf]# vim nginx.conf

http {

        upstream westos{
        server 172.25.4.3;
        server 172.25.4.4;
        }

        upstream redhat{
        ip_hash;
        server 172.25.4.3;
        server 172.25.4.4;
        }



    server {
        listen       80;
        server_name  www1.westos.org;

        location / {
        #       root /www1;
        #       index index.html;
                proxy_pass http://westos;
        }
}

    server {
        listen       80;
        server_name  www2.westos.org;

        location / {
        #        root /www2;
        #        index index.html;
                proxy_pass http://redhat;
        }
	}
}

[root@server2 conf]# systemctl reload nginx

网页测试:

www1.westos.org    #负载均衡
www2.westos.org    #hash
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值