如何在CentOS7上搭建Nginx

发布时间:2021-08-18 21:14:20 作者:chen
来源:亿速云 阅读:367
# 如何在CentOS7上搭建Nginx

## 前言

Nginx(发音为"engine-x")是一款高性能的HTTP和反向代理服务器,以其稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。它不仅可以作为Web服务器使用,还能作为负载均衡器、邮件代理服务器和HTTP缓存等。本文将详细介绍在CentOS 7操作系统上搭建Nginx的完整过程,包括安装、配置、优化和常见问题解决等内容。

## 环境准备

在开始之前,请确保您已经具备以下条件:

1. 一台运行CentOS 7的服务器(物理机或虚拟机)
2. 具有root权限或sudo权限的用户账户
3. 能够访问互联网以下载必要的软件包
4. 基本的Linux命令行操作知识

建议在操作前更新系统软件包:

```bash
sudo yum update -y

安装Nginx

方法一:通过Yum仓库安装(推荐)

CentOS 7的默认仓库中不包含最新版本的Nginx,因此我们需要先添加Nginx的官方仓库:

  1. 安装EPEL仓库(Extra Packages for Enterprise Linux):
sudo yum install epel-release -y
  1. 添加Nginx官方仓库:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  1. 安装Nginx:
sudo yum install nginx -y
  1. 验证安装:
nginx -v

方法二:从源代码编译安装

如果需要特定版本的Nginx或需要自定义模块,可以选择源码编译安装:

  1. 安装编译依赖:
sudo yum install gcc pcre-devel zlib-devel openssl-devel -y
  1. 下载Nginx源码包(以1.20.1版本为例):
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar -zxvf nginx-1.20.1.tar.gz
cd nginx-1.20.1
  1. 配置编译选项:
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-threads
  1. 编译并安装:
make && sudo make install
  1. 创建系统服务(可选):
sudo vi /etc/systemd/system/nginx.service

添加以下内容:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.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 $MNPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

然后执行:

sudo systemctl daemon-reload
sudo systemctl enable nginx

配置Nginx

基本配置

Nginx的主配置文件位于/etc/nginx/nginx.conf(Yum安装)或/usr/local/nginx/conf/nginx.conf(源码安装)。以下是一些关键配置项:

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

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;
    tcp_nodelay on;
    
    keepalive_timeout 65;
    types_hash_max_size 2048;
    
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

虚拟主机配置

建议为每个网站创建单独的配置文件:

  1. 创建配置文件:
sudo vi /etc/nginx/conf.d/example.com.conf
  1. 添加基本虚拟主机配置:
server {
    listen 80;
    server_name example.com www.example.com;
    
    root /var/www/example.com/html;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    error_page 404 /404.html;
    location = /404.html {
        internal;
    }
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        internal;
    }
}
  1. 创建网站目录并设置权限:
sudo mkdir -p /var/www/example.com/html
sudo chown -R nginx:nginx /var/www/example.com
sudo chmod -R 755 /var/www/example.com
  1. 创建测试页面:
sudo vi /var/www/example.com/html/index.html

内容示例:

<!DOCTYPE html>
<html>
<head>
    <title>Welcome to Example.com</title>
</head>
<body>
    <h1>Success! The example.com server is working!</h1>
</body>
</html>

启动和管理Nginx服务

启动Nginx

sudo systemctl start nginx

设置开机自启

sudo systemctl enable nginx

检查状态

sudo systemctl status nginx

重新加载配置(修改配置后)

sudo systemctl reload nginx

停止Nginx

sudo systemctl stop nginx

重启Nginx

sudo systemctl restart nginx

防火墙配置

如果系统启用了防火墙,需要开放HTTP(80)和HTTPS(443)端口:

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

SSL/TLS配置(HTTPS)

使用Let’s Encrypt免费证书

  1. 安装Certbot:
sudo yum install certbot python2-certbot-nginx -y
  1. 获取证书:
sudo certbot --nginx -d example.com -d www.example.com
  1. 自动续期测试:
sudo certbot renew --dry-run

手动配置SSL

  1. 生成自签名证书(仅测试用):
sudo mkdir /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/example.com.key \
-out /etc/nginx/ssl/example.com.crt
  1. 修改Nginx配置:
server {
    listen 443 ssl;
    server_name example.com www.example.com;
    
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    
    # 其他配置...
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

性能优化

调整工作进程

worker_processes auto; # 自动设置为CPU核心数
worker_rlimit_nofile 100000; # 每个worker能打开的文件描述符数量

事件模块优化

events {
    worker_connections 4096; # 每个worker的最大连接数
    multi_accept on; # 一次接受所有新连接
    use epoll; # 使用epoll事件模型
}

HTTP模块优化

http {
    sendfile on; # 启用sendfile
    tcp_nopush on; # 仅在sendfile开启时有效
    tcp_nodelay on; # 禁用Nagle算法
    
    keepalive_timeout 30; # 保持连接超时时间
    keepalive_requests 1000; # 每个连接的最大请求数
    
    client_body_buffer_size 10K; # 客户端请求体缓冲区大小
    client_header_buffer_size 1k; # 客户端请求头缓冲区大小
    client_max_body_size 8m; # 最大请求体大小
    large_client_header_buffers 4 8k; # 大型请求头缓冲区
    
    open_file_cache max=200000 inactive=20s; # 文件描述符缓存
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    gzip on; # 启用gzip压缩
    gzip_min_length 10240;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
    gzip_disable "MSIE [1-6]\.";
}

安全配置

隐藏Nginx版本号

server_tokens off;

防止点击劫持

add_header X-Frame-Options "SAMEORIGIN";

启用XSS保护

add_header X-XSS-Protection "1; mode=block";

禁用内容类型嗅探

add_header X-Content-Type-Options "nosniff";

限制HTTP方法

limit_except GET POST {
    deny all;
}

防止目录遍历

location / {
    autoindex off;
}

日志管理

访问日志分割

  1. 创建日志分割脚本:
sudo vi /etc/logrotate.d/nginx
  1. 添加以下内容:
/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 640 nginx adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

常见问题解决

1. 启动失败:端口被占用

sudo netstat -tulnp | grep :80
sudo kill -9 <PID>

2. 403 Forbidden错误

可能原因: - 目录权限不正确 - SELinux限制

解决方法:

sudo chown -R nginx:nginx /var/www/example.com
sudo chmod -R 755 /var/www/example.com
# 如果使用SELinux
sudo chcon -R -t httpd_sys_content_t /var/www/example.com

3. 502 Bad Gateway错误

可能原因: - 后端服务未启动 - 连接超时

检查方法:

sudo tail -f /var/log/nginx/error.log

4. 性能问题排查

# 查看Nginx工作进程
ps -ef | grep nginx

# 查看连接状态
netstat -ant | grep :80 | awk '{print $6}' | sort | uniq -c | sort -n

# 实时监控访问日志
tail -f /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr

总结

本文详细介绍了在CentOS 7上安装和配置Nginx的全过程,包括: 1. 通过Yum仓库和源码两种安装方式 2. 基本的Nginx配置和虚拟主机设置 3. SSL/TLS证书配置实现HTTPS 4. 性能优化和安全加固建议 5. 常见问题的解决方法

Nginx是一个功能强大且灵活的Web服务器,通过合理的配置可以满足各种Web服务需求。建议在生产环境中进一步根据实际需求调整配置参数,并定期更新Nginx版本以获得最新的功能和安全补丁。

扩展阅读

  1. Nginx官方文档
  2. Nginx性能调优指南
  3. Let’s Encrypt官方文档
  4. CentOS 7系统管理手册

”`

注:本文总字数约3500字,涵盖了Nginx在CentOS 7上的完整安装配置流程。实际使用时可根据具体需求调整配置参数。

推荐阅读:
  1. 如何在centos7中安装nginx
  2. graphite在centos7上的部署搭建

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nginx centos7

上一篇:怎么优化Win7系统盘空间

下一篇:Hbase写数据和存数据的过程

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》