虽然CentOS 8出来很久了,但是老杨通常还是喜欢用Centos 7+。最近将搬瓦工VPS系统更新到了 CentOS 8,发现 LNMP 安装配置上有了一些细节变化,所以重新记录。如果是新手,建议在全新系统环境下操作,并先运行 dnf -y upgrade
更新系统软件包,以及一些可选系统基础配置。
注:文中不少地方用了
sed
命令替换内容修改配置文件,该方式完全依赖匹配文本。如果文本有差别就会修改失败,建议在搭建生产环境时用vi
等编辑器手动修改,以免漏掉配置。
安装配置 Nginx
dnf -y install nginx
修改 /etc/nginx/nginx.conf
配置文件,在下面位置添加红色参数,以关闭 Nginx 版本号输出,并且将 fastcgi 进程超时时间设置延长,以避免 504 Gateway Time-out 问题,设置合适 buffer 值。
http {
...
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 16k;
fastcgi_busy_buffers_size 24k;
fastcgi_buffers 8 16k;
...
}
修改默认 server{...}
,禁止访问 Web 默认目录。
server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 403; # root /usr/share/nginx/html; }
修改 FastCGI 配置文件 SERVER_SOFTWARE
参数,删除版本号输出。
sed -i 's|nginx/$nginx_version|nginx|' /etc/nginx/fastcgi.conf sed -i 's|nginx/$nginx_version|nginx|' /etc/nginx/fastcgi_params
firewall-cmd --state
检查是否安装启用防火墙。如果没有,用下面命令安装启用。
dnf -y install firewalld systemctl start firewalld systemctl enable firewalld
防火墙放行 HTTP
HTTPS
端口。
firewall-cmd --permanent --zone=public --add-service={http,https} firewall-cmd --reload
运行 Nginx 服务并设置开机启动。
systemctl start nginx systemctl enable nginx
安装配置 MariaDB
dnf -y install mariadb-server
运行 MariaDB 并设置开机启动。
systemctl start mariadb systemctl enable mariadb
运行初始化安全配置。
mysql_secure_installation
输入 root 密码。安装后默认没有密码,直接按 Enter
进入下一步。
Enter current password for root (enter for none):
设置 root 密码,选择 Y
回车,输入两遍密码完成设置。
Set root password? [Y/n]
接下来几个选项都选 Y
,这将删除测试帐户和数据库,以及禁用远程 root 登录并刷新权限表。
Remove anonymous users? [Y/n] Disallow root login remotely? [Y/n] Remove test database and access to it? [Y/n] Reload privilege tables now? [Y/n]
至此,MariaDB 初始化安全配置完成。
安装配置 PHP
安装 FastCGI, MySQL 及其它常用 PHP 模块(对于 WordPress,官方还推荐安装 imagick 模块。不过其有潜在安全问题,涉及到的功能也很少使用,所以笔者这里没有安装),过程中会将 PHP 核心软件包作为依赖项安装。
dnf -y install php-fpm php-mysqlnd php-common php-cli php-gd php-opcache php-mbstring php-json php-xml php-pecl-zip
取消 PHP 配置文件里 cgi.fix_pathinfo
参数行注释,并设置值为 0,以防范 PHP 解释器被欺骗执行恶意文件。
sed -i 's|;cgi.fix_pathinfo=1|cgi.fix_pathinfo=0|' /etc/php.ini
取消 PHP 配置文件里 session.save_path
参数行注释,并设置值为 php-fpm 默认会话储存目录。
sed -i 's|;session.save_path = "/tmp"|session.save_path = "/var/lib/php/session"|' /etc/php.ini
更改 PHP 配置文件里 upload_max_filesize
参数,将最大文件上传调整为 20M。
sed -i 's|upload_max_filesize = 2M|upload_max_filesize = 20M|' /etc/php.ini sed -i 's|post_max_size = 8M|post_max_size = 80M|' /etc/php.ini
更改 PHP 配置文件里 memory_limit
参数,提升最大内存用量至 512M(酌情机器配置)。
sed -i 's|memory_limit = 128M|memory_limit = 512M|' /etc/php.ini
更改 PHP 配置文件里 expose_php
参数,将值改为 Off,以关闭 PHP 版本号输出。
sed -i 's|expose_php = On|expose_php = Off|' /etc/php.ini
修改 php-fpm 配置文件,将默认 apache
用户/组改为 nginx
。
sed -i 's|user = apache|user = nginx|' /etc/php-fpm.d/www.conf sed -i 's|group = apache|group = nginx|' /etc/php-fpm.d/www.conf
将 php-fpm 相关目录用户组改为 nginx
。
chgrp -R nginx /var/lib/php/opcache /var/lib/php/session /var/lib/php/wsdlcache
启动 php-fpm 服务并设置开机自启。
systemctl start php-fpm systemctl enable php-fpm
开始搭建网站
这里用 WordPress 程序搭建一个示例网站。
创建网站目录和设置合适权限
# 创建网站目录 mkdir -p /var/www/example.com # 下载 WordPress 程序并解压到目录 wget -P /var/www/example.com https://wordpress.org/latest.tar.gz tar -zxvf /var/www/example.com/latest.tar.gz --strip-components 1 -C /var/www/example.com rm -f /var/www/example.com/latest.tar.gz # 设置 SELinux 读写安全上下文,以允许 httpd 进程读写网站目录/文件 # WordPress 完整功能运行有不少目录/文件需要读写,细分设置比较麻烦,所以这里递归设置 # 对于静态文件网站,则无需此设置(/var/www 目录下内容会自动标记 httpd_sys_content_t 只读安全上下文) # 如果要删除设置的安全上下文,将下面 -a 参数改为 -d 并去掉 -t 和后面指定的安全上下文,然后再运行 semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/example.com(/.*)?" restorecon -R -v /var/www/example.com # 允许 HTTPD 脚本和模块连接网络(不设置 WordPress 将无法在线更新和安装主题/插件) setsebool -P httpd_can_network_connect 1 # 将目录所有者改为 nginx 用户/组 chown -R nginx:nginx /var/www/example.com # 如果不用 80 443 等常规 Web 端口,需设置允许 httpd 进程使用指定的端口(例如 2333 端口) # 可使用 semanage port -l | grep http_port_t 命令查询已允许端口 # 另外别忘了设置防火墙放行端口 semanage port -a -t http_port_t -p tcp 2333
申请 Let’s Encrypt 免费证书
先设置好域名解析。然后创建 Nginx 网站配置文件。
vi /etc/nginx/conf.d/example.com.conf
内容如下(简单使域名可访问就行,具体的之后再修改)。
server { listen 80; listen [::]:80; server_name example.com www.example.com; root /var/www/example.com; }
刷新 Nginx 服务,使配置文件生效。
nginx -s reload
安装 ACME 客户端申请 SSL 证书,这里用热门的 acme.sh。
# 安装后断开 SSH 连接重新登录 curl https://get.acme.sh | sh # 设置默认申请 Let’s Encrypt 证书 acme.sh --set-default-ca --server letsencrypt
申请域名 SSL 证书。
acme.sh --issue -d example.com -d www.example.com -w /var/www/example.com
将证书/密钥安装到相关目录,并重启 Nginx 服务。
acme.sh --install-cert -d example.com -d www.example.com / --key-file /etc/pki/tls/private/example.com.key / --fullchain-file /etc/pki/tls/certs/example.com.cer / --reloadcmd "systemctl force-reload nginx"
生成 DH 会话密钥。这与上面的域名密钥不同,它可以多个站点共用。
openssl dhparam -out /etc/pki/tls/certs/dhparam.pem 2048
修改 Nginx 网站配置文件
vi /etc/nginx/conf.d/example.com.conf
内容如下(为方便理解添加了中文注释,使用时建议删除)。
# HTTP 重定向到 HTTPS server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://www.example.com$request_uri; } # 根域名重定向到 WWW server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; return 301 https://www.example.com$request_uri; # 证书文件,依序为 证书链+域名证书,域名证书密钥,DH 会话密钥 ssl_certificate /etc/pki/tls/certs/example.com.cer; ssl_certificate_key /etc/pki/tls/private/example.com.key; ssl_dhparam /etc/pki/tls/certs/dhparam.pem; # SSL 会话,协议版本,加密算法等参数 ssl_session_timeout 5m; ssl_session_cache shared:SSL:10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 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; } # WWW 主站点 server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.example.com; root /var/www/example.com; index index.html index.htm index.php; # 证书文件,依序为 证书链+域名证书,域名证书密钥,DH 会话密钥 ssl_certificate /etc/pki/tls/certs/example.com.cer; ssl_certificate_key /etc/pki/tls/private/example.com.key; ssl_dhparam /etc/pki/tls/certs/dhparam.pem; # SSL 会话,协议版本,加密算法等参数 ssl_session_timeout 5m; ssl_session_cache shared:SSL:10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 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; # 检查访问文件/目录是否存在,否则重定向 /index.php,若 URL 带参数则附加 location / { try_files $uri $uri/ /index.php$is_args$args; } # 可选:WordPress 程序 Google XML Sitemaps 插件伪静态重写规则 rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?/.xml$ "/index.php?xml_sitemap=params=$2" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?/.xml/.gz$ "/index.php?xml_sitemap=params=$2;zip=true" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?/.html$ "/index.php?xml_sitemap=params=$2;html=true" last; rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?/.html.gz$ "/index.php?xml_sitemap=params=$2;html=true;zip=true" last; # 将 PHP 请求传递给 FastCGI 处理,这里引用默认配置 include /etc/nginx/default.d/php.conf; # 设置图片资源缓存时间 location ~ .*/.(png|jpg|jpeg|gif|bmp)$ { expires 30d; } # 设置其它资源缓存时间 location ~ .*/.(js|css)?$ { expires 12h; } # 拒绝对隐藏文件访问 location ~ //. { deny all; } # 拒绝对指定目录 PHP 文件访问 location ~* /(?:uploads|files)/.*/.php$ { deny all; } # 设置日志存儲位置 access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log warn; }
修改后刷新 Nginx 服务生效。
nginx -s reload
创建网站数据库和帐户
使用数据库 root 帐号登录 SQL Shell,过程中输入之前设置的密码。
mysql -u root -p
创建一个数据库,名称可随意(不区分大小写),譬如 testdb
。
CREATE DATABASE testdb;
创建数据库帐户,例如用户名 testuser
,密码 password
,并赋予 testdb
数据库管理权限给创建的帐户。
GRANT ALL ON testdb.* TO 'testuser'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
刷新数据库权限表。
FLUSH PRIVILEGES;
之后用 exit
退出。
初始化网站程序安装
访问网站域名完成 WordPress 安装。过程中输入之前设置的数据库信息,设置网站标题,管理员帐号等。
到此,一个基于 LNMP 环境运行的 WordPress 网站就搭建安装完成了。
如果你在搭建后访问出错,先看下 Nginx 日志文件有没有错误,例如查看最近 30 条错误记录。
tail -30 /var/log/nginx/example.com.error.log
或者查看 SELinux 有没有拒绝日志。
# 查看 SELinux 最近拒绝哪些操作 ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today # 查看错误详细信息(如果找不到命令,需安装 setroubleshoot 软件包) sealert -l "*"
如果查看 SELinux 日志,看到类似阻止 php-fpm 可写可执行内存分配,并导致页面访问报错。可以修改 /etc/php.ini
配置文件里 pcre.jit
参数值为 0
并去掉注释(如果找不到参数,手动添加参数到 [Pcre]
分组下),然后 systemctl restart php-fpm
重启服务。
另一个解决方法是用下面命令取消 httpd 对可写可执行内存分配的限制,但这会降低安全保护,仅作最后选项。
setsebool -P httpd_execmem 1
搬瓦工香港 CN2 GIA VPS 套餐介绍
优惠码:BWH3HYATVBJW,节约6.58%,全场通用!
搬瓦工 CN2 GIA-E套餐推荐
下面是搬瓦工 CN2 GIA-E 所有套餐,目前已经将 CN2 GIA-E 限量版套餐再次整合进去。目前购买的人数比较多的就是限量版方案以及最便宜的常规版方案也就是 $169.99 年付那个。这两个主要是流量区别比较大,以及 CPU 方面限量版方案有所缩水,其他的基本都一。优惠码:BWH3HYATVBJW,节约6.58%,全场通用!
方案 | 内存 | CPU | 硬盘 | 流量/月 | 带宽 | 机房 | 价格 | 购买 |
---|---|---|---|---|---|---|---|---|
CN2 GIA-E 限量版 |
1GB | 1核 | 20GB | 0.5TB | 1Gbps | DC6 CN2 GIA-E DC9 CN2 GIA 日本软银 JPOS_1 DC3 CN2 DC8 ZNET DC2 QNET DC4 MCOM 美国弗里蒙特 美国新泽西 美国纽约 荷兰阿姆斯特丹 |
$99.99/年 | 购买 |
CN2 GIA-E | 1GB | 2核 | 20GB | 1TB | 2.5Gbps | $49.99/季度 $169.99/年 |
购买 | |
CN2 GIA-E | 2GB | 3核 | 40GB | 2TB | 2.5Gbps | $89.99/季度 $299.99/年 |
购买 | |
CN2 GIA-E | 4GB | 4核 | 80GB | 3TB | 2.5Gbps | $56.99/月 $549.99/年 |
购买 | |
CN2 GIA-E | 8GB | 6核 | 160GB | 5TB | 5Gbps | $86.99/月 $879.99/年 |
购买 | |
CN2 GIA-E | 16GB | 8核 | 320GB | 8TB | 5Gbps | $159.99/月 $1599.99/年 |
购买 | |
CN2 GIA-E | 32GB | 10核 | 640GB | 10TB | 10Gbps | $289.99/月 $2759.99/年 |
购买 | |
CN2 GIA-E | 64GB | 12核 | 1280GB | 12TB | 10Gbps | $549.99/月 $5399.99/年 |
购买 |
网络测试
- 美国 cn2 gia:162.244.241.103\104\105\106\107
- 日本软银:185.212.59.148\149\150\151\152
- 香港cn2 gia:93.179.124.167\168\169\170\171\172
- 荷兰联通:104.255.65.1