Oracle Linux 8.2系统下快速安装配置Nginx Web服务器的详细教程与实用技巧
1. Oracle Linux 8.2系统简介
Oracle Linux是基于Red Hat Enterprise Linux(RHEL)的克隆版本,由Oracle公司维护和支持。Oracle Linux 8.2是该系列的一个重要版本,提供了企业级的稳定性、安全性和性能。它与RHEL 8.2完全兼容,可以使用相同的软件包和配置。Oracle Linux 8.2使用了DNF(Dandified YUM)作为默认的包管理器,替代了之前版本中的YUM。
2. Nginx简介及其优势
Nginx(发音为”engine-x”)是一款高性能的HTTP和反向代理Web服务器,同时也提供IMAP/POP3/SMTP服务。Nginx由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发,第一个公开版本于2004年发布。
Nginx的主要优势包括:
- 高性能:Nginx采用事件驱动架构,能够处理大量并发连接,资源消耗低。
- 稳定性:Nginx在设计上注重稳定性,能够长时间运行而不出现故障。
- 丰富的功能:支持负载均衡、反向代理、内容缓存、SSL/TLS加密等功能。
- 模块化设计:Nginx具有丰富的第三方模块,可以扩展其功能。
- 配置简单:相比其他Web服务器,Nginx的配置语法更加简洁明了。
3. 安装前准备工作
在开始安装Nginx之前,我们需要做一些准备工作:
3.1 系统更新
首先,确保系统是最新的:
sudo dnf update -y 3.2 安装必要的工具
安装一些必要的工具和软件包:
sudo dnf install -y wget vim curl 3.3 检查系统版本
确认您正在使用Oracle Linux 8.2:
cat /etc/oracle-release 输出应该类似于:
Oracle Linux Server release 8.2 3.4 检查网络连接
确保系统能够访问互联网:
ping -c 4 google.com 4. Nginx的安装步骤
在Oracle Linux 8.2中,我们可以通过多种方式安装Nginx。下面介绍两种最常用的方法:使用AppStream仓库和使用EPEL仓库。
4.1 使用AppStream仓库安装Nginx
Oracle Linux 8.2的AppStream仓库中包含了Nginx软件包,我们可以直接安装:
sudo dnf module install nginx:1.18 -y 这将安装Nginx 1.18版本及其依赖项。
4.2 使用EPEL仓库安装Nginx
EPEL(Extra Packages for Enterprise Linux)是一个由Fedora特别兴趣组维护的仓库,提供了许多额外的软件包。首先安装EPEL仓库:
sudo dnf install -y epel-release 然后安装Nginx:
sudo dnf install -y nginx 4.3 验证安装
安装完成后,可以通过以下命令验证Nginx是否已成功安装:
nginx -v 输出应该类似于:
nginx version: nginx/1.18.0 5. 基本配置方法
Nginx的主要配置文件位于/etc/nginx/nginx.conf。在编辑配置文件之前,建议先备份原始配置文件:
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak 5.1 配置文件结构
Nginx的配置文件由指令和块组成,基本结构如下:
# 用户和组 user nginx; # 工作进程数,通常设置为CPU核心数 worker_processes auto; # 错误日志位置 error_log /var/log/nginx/error.log; # 主进程ID位置 pid /run/nginx.pid; # 事件模块配置 events { # 每个工作进程的最大连接数 worker_connections 1024; } # HTTP服务器配置 http { # 包含的MIME类型定义 include /etc/nginx/mime.types; # 默认MIME类型 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 sendfile on; # 超时时间 keepalive_timeout 65; # 包含其他配置文件 include /etc/nginx/conf.d/*.conf; } 5.2 简单网站配置
创建一个简单的网站配置文件:
sudo vim /etc/nginx/conf.d/mywebsite.conf 添加以下内容:
server { listen 80; server_name localhost; # 网站根目录 root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } # 自定义错误页面 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 6. 启动和管理Nginx服务
6.1 启动Nginx服务
sudo systemctl start nginx 6.2 设置Nginx开机自启
sudo systemctl enable nginx 6.3 检查Nginx服务状态
sudo systemctl status nginx 6.4 停止、重启和重载Nginx
停止Nginx服务:
sudo systemctl stop nginx 重启Nginx服务:
sudo systemctl restart nginx 重载Nginx配置(不中断服务):
sudo systemctl reload nginx 6.5 测试Nginx配置
在修改配置文件后,应该先检查配置文件语法是否正确:
sudo nginx -t 如果配置文件语法正确,输出将类似于:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful 7. 配置防火墙和SELinux
7.1 配置防火墙
Oracle Linux 8.2使用firewalld作为默认的防火墙管理工具。要允许HTTP和HTTPS流量,需要打开相应的端口:
# 永久开放HTTP(80)端口 sudo firewall-cmd --permanent --add-service=http # 永久开放HTTPS(443)端口 sudo firewall-cmd --permanent --add-service=https # 重新加载防火墙配置 sudo firewall-cmd --reload 检查防火墙规则:
sudo firewall-cmd --list-all 7.2 配置SELinux
SELinux(Security-Enhanced Linux)是Linux内核的一个安全模块,默认情况下在Oracle Linux 8.2中是启用的。为了确保Nginx能够正常运行,我们需要配置SELinux策略。
7.2.1 检查SELinux状态
sestatus 输出应该类似于:
SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 31 7.2.2 设置Nginx的SELinux布尔值
# 允许Nginx网络连接 sudo setsebool -P httpd_can_network_connect 1 # 允许Nginx发送邮件 sudo setsebool -P httpd_can_sendmail 1 # 允许Nginx使用CGI脚本 sudo setsebool -P httpd_enable_cgi 1 7.2.3 设置正确的文件上下文
如果您的网站文件位于非标准位置,需要设置正确的SELinux文件上下文:
# 假设网站文件位于 /data/www sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?" sudo restorecon -Rv /data/www 8. 设置虚拟主机
虚拟主机允许您在单个服务器上托管多个网站。下面介绍如何配置基于名称的虚拟主机。
8.1 创建网站目录
为每个网站创建目录:
sudo mkdir -p /var/www/example1.com/html sudo mkdir -p /var/www/example2.com/html 设置正确的权限:
sudo chown -R nginx:nginx /var/www/example1.com/html sudo chown -R nginx:nginx /var/www/example2.com/html sudo chmod -R 755 /var/www 8.2 创建测试页面
为每个网站创建测试页面:
echo "<h1>Welcome to Example1.com!</h1>" | sudo tee /var/www/example1.com/html/index.html echo "<h1>Welcome to Example2.com!</h1>" | sudo tee /var/www/example2.com/html/index.html 8.3 创建虚拟主机配置文件
为第一个网站创建配置文件:
sudo vim /etc/nginx/conf.d/example1.com.conf 添加以下内容:
server { listen 80; server_name example1.com www.example1.com; root /var/www/example1.com/html; index index.html index.htm; access_log /var/log/nginx/example1.com.access.log; error_log /var/log/nginx/example1.com.error.log; location / { try_files $uri $uri/ =404; } } 为第二个网站创建配置文件:
sudo vim /etc/nginx/conf.d/example2.com.conf 添加以下内容:
server { listen 80; server_name example2.com www.example2.com; root /var/www/example2.com/html; index index.html index.htm; access_log /var/log/nginx/example2.com.access.log; error_log /var/log/nginx/example2.com.error.log; location / { try_files $uri $uri/ =404; } } 8.4 测试并重载Nginx配置
测试配置文件语法:
sudo nginx -t 如果语法正确,重载Nginx配置:
sudo systemctl reload nginx 8.5 测试虚拟主机
在本地机器上编辑/etc/hosts文件,添加以下内容(将服务器IP替换为您的实际IP):
192.168.1.100 example1.com www.example1.com 192.168.1.100 example2.com www.example2.com 然后使用浏览器或curl测试:
curl http://example1.com curl http://example2.com 9. 配置SSL/TLS加密
为了保护网站数据传输的安全性,我们需要配置SSL/TLS加密。这里我们使用Let’s Encrypt提供的免费SSL证书。
9.1 安装Certbot
Certbot是一个自动化工具,可以获取和更新Let’s Encrypt SSL证书。首先安装EPEL仓库:
sudo dnf install -y epel-release 然后安装Certbot和Nginx插件:
sudo dnf install -y certbot python3-certbot-nginx 9.2 获取SSL证书
为第一个域名获取SSL证书:
sudo certbot --nginx -d example1.com -d www.example1.com 为第二个域名获取SSL证书:
sudo certbot --nginx -d example2.com -d www.example2.com 在获取证书的过程中,Certbot会询问一些问题,如电子邮件地址(用于紧急通知和密钥恢复)以及是否同意服务条款。按照提示操作即可。
9.3 验证证书自动续期
Let’s Encrypt证书有效期为90天。Certbot会自动设置一个定时任务来续期证书。您可以通过以下命令验证:
sudo systemctl status certbot-renew.timer 如果需要手动测试续期过程:
sudo certbot renew --dry-run 9.4 手动配置SSL(可选)
如果您想手动配置SSL而不是使用Certbot,可以按照以下步骤操作:
9.4.1 创建SSL配置
编辑Nginx配置文件,为第一个网站添加SSL配置:
sudo vim /etc/nginx/conf.d/example1.com.conf 修改为:
server { listen 80; server_name example1.com www.example1.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name example1.com www.example1.com; root /var/www/example1.com/html; index index.html index.htm; ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers off; access_log /var/log/nginx/example1.com-ssl.access.log; error_log /var/log/nginx/example1.com-ssl.error.log; location / { try_files $uri $uri/ =404; } } 为第二个网站添加类似的配置:
sudo vim /etc/nginx/conf.d/example2.com.conf 修改为:
server { listen 80; server_name example2.com www.example2.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name example2.com www.example2.com; root /var/www/example2.com/html; index index.html index.htm; ssl_certificate /etc/letsencrypt/live/example2.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example2.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers off; access_log /var/log/nginx/example2.com-ssl.access.log; error_log /var/log/nginx/example2.com-ssl.error.log; location / { try_files $uri $uri/ =404; } } 测试并重载Nginx配置:
sudo nginx -t sudo systemctl reload nginx 10. 优化Nginx性能
10.1 调整工作进程数
编辑主配置文件:
sudo vim /etc/nginx/nginx.conf 根据CPU核心数调整worker_processes:
# 设置为auto,Nginx会自动检测CPU核心数 worker_processes auto; 10.2 调整工作连接数
在events块中调整worker_connections:
events { worker_connections 2048; multi_accept on; use epoll; } 10.3 启用Gzip压缩
在http块中添加Gzip配置:
http { # ... 其他配置 ... # 启用Gzip压缩 gzip on; gzip_vary on; gzip_min_length 1024; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # ... 其他配置 ... } 10.4 配置缓存
在http块中添加缓存配置:
http { # ... 其他配置 ... # 配置缓存路径 proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api_cache:10m inactive=60m use_temp_path=off; # ... 其他配置 ... } 然后在server或location块中使用缓存:
location / { proxy_cache api_cache; proxy_pass http://backend; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; } 10.5 配置缓冲区
在http块中调整缓冲区大小:
http { # ... 其他配置 ... # 调整缓冲区大小 client_body_buffer_size 16K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 4 8k; # ... 其他配置 ... } 10.6 配置超时设置
在http块中调整超时设置:
http { # ... 其他配置 ... # 调整超时设置 client_body_timeout 12; client_header_timeout 12; send_timeout 10; keepalive_timeout 15; keepalive_requests 100; # ... 其他配置 ... } 10.7 禁用access_log(可选)
如果不需要记录访问日志,可以禁用以提高性能:
access_log off; 或者只记录错误:
access_log /var/log/nginx/access.log combined buffer=512k flush=1m; 11. 实用技巧和故障排除
11.1 常用命令
检查Nginx版本和编译选项:
nginx -V 检查配置文件语法:
nginx -t 查看Nginx进程:
ps aux | grep nginx 查看Nginx监听端口:
ss -tulpn | grep nginx 查看Nginx访问日志:
tail -f /var/log/nginx/access.log 查看Nginx错误日志:
tail -f /var/log/nginx/error.log 11.2 常见问题及解决方案
11.2.1 端口被占用
如果启动Nginx时提示端口被占用,可以使用以下命令查找占用端口的进程:
sudo ss -tulpn | grep :80 然后终止占用端口的进程或更改Nginx的监听端口。
11.2.2 权限问题
如果遇到权限问题,确保Nginx用户(通常是nginx)对网站目录有正确的访问权限:
sudo chown -R nginx:nginx /var/www/your_website sudo chmod -R 755 /var/www/your_website 11.2.3 SELinux导致的问题
如果SELinux阻止了Nginx的某些操作,可以查看SELinux日志:
sudo grep nginx /var/log/audit/audit.log | audit2allow 然后根据需要创建自定义SELinux策略:
sudo grep nginx /var/log/audit/audit.log | audit2allow -M mynginx sudo semodule -i mynginx.pp 11.2.4 防火墙阻止访问
如果无法访问Nginx服务器,检查防火墙设置:
sudo firewall-cmd --list-all 确保HTTP和HTTPS服务已开放:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload 11.3 实用配置示例
11.3.1 配置反向代理
以下是一个将请求代理到后端应用服务器的示例:
server { listen 80; server_name example.com www.example.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 11.3.2 配置负载均衡
以下是一个简单的负载均衡配置示例:
http { upstream backend { server backend1.example.com weight=5; server backend2.example.com; server backend3.example.com backup; } server { listen 80; server_name example.com www.example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } 11.3.3 配置URL重写
以下是一个URL重写的示例:
server { listen 80; server_name example.com www.example.com; # 将所有请求重定向到非www域名 if ($host = www.example.com) { return 301 http://example.com$request_uri; } # 将.html扩展名隐藏 location / { try_files $uri $uri.html $uri/ =404; } # 重写旧的URL到新的URL location /old-page { return 301 /new-page; } } 11.3.4 配置访问限制
以下是一个基于IP地址限制访问的示例:
server { listen 80; server_name example.com www.example.com; # 允许特定IP访问管理页面 location /admin { allow 192.168.1.0/24; allow 10.0.0.5; deny all; } # 基本认证 location /private { auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; } } 要创建密码文件,可以使用htpasswd工具:
sudo dnf install -y httpd-tools sudo htpasswd -c /etc/nginx/.htpasswd username 11.3.5 配置安全头
以下是一个添加安全头的示例:
server { listen 443 ssl http2; server_name example.com www.example.com; # SSL配置 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 安全头 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; style-src 'self' 'unsafe-inline';" always; # HSTS(仅在HTTPS连接中有效) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # ... 其他配置 ... } 12. 总结
本教程详细介绍了在Oracle Linux 8.2系统下安装和配置Nginx Web服务器的全过程。我们从系统准备开始,逐步介绍了Nginx的安装、基本配置、服务管理、防火墙和SELinux配置、虚拟主机设置、SSL/TLS加密配置、性能优化以及一些实用技巧和故障排除方法。
通过本教程,您应该能够在Oracle Linux 8.2系统上成功部署并运行一个安全、高效的Nginx Web服务器。无论是托管单个网站还是多个虚拟主机,无论是提供静态内容还是作为反向代理,Nginx都能够胜任。
当然,Nginx的功能远不止于此,它还有许多高级功能和配置选项等待您去探索。希望本教程能够为您提供一个良好的起点,帮助您更好地理解和使用Nginx。
最后,请记住,服务器安全是一个持续的过程。定期更新系统、监控服务器状态、备份数据以及遵循最佳安全实践是确保您的Web服务器长期稳定运行的关键。
祝您使用Nginx愉快!
支付宝扫一扫
微信扫一扫