在Nginx和Ubuntu 13服务器上部署WordPress博客
说明
长期以来,Apache是为Linux服务器上的网站提供动力的主要Web服务器。 Nginx是一个相对较新的竞争者,并且有充分的理由成为非常受欢迎的替代方案。
服务器配置
软件配置
WordPress网站将由以下软件提供支持。
Web服务器 | 数据库服务器 |
---|---|
Nginx | MySQL |
PHP | WordPress |
创建用户和组
部署完成后,除非绝对需要,否则任何人都不应使用Root帐户。我们需要创建两个用户帐户和两个组,一个用于网络应用程序的日常维护,另一个用于系统管理。创建用户和组之后,我们将保护SSH以仅允许我们的非管理帐户远程访问。如果成功使用某人的帐户远程登录,则这种隔离将增加另一层安全性,以帮助防止黑客获得完全控制。
- 创建日常用户帐户。
sudo adduser jsmith
- 设置该帐户的密码。
sudo passwd jsmith
- 创建服务器管理员帐户。
sudo adduser jsmith-admin
- 设置管理员帐户密码
sudo passwd jsmith-admin
- 创建webadmins组。
sudo groupadd webadmins
- 创建系统管理员组。
sudo groupadd sysadmins
- 创建一个远程管理组,我们将为其授予SSH访问权限。
sudo groupadd remoteadmins
- 将日常帐户添加到webadmins组。
sudo usermod -G webadmins -a jsmith
- 将服务器管理员帐户添加到系统管理员组。
sudo usermod -G sysadmins -a jsmith-admin
- 将Nginx帐户添加到webadmins组,以授予其对我们的/ webapps目录的访问权限,这在我们在下面对其进行安全保护之后将需要。
sudo usermod -G webadmins -a www-data
- 由于我们希望jsmith作为我们能够远程访问我们的Web服务器,因此我们需要将该帐户添加到remoteadmins组。
sudo usermod -G remoateadmins -a jsmith
安装所需的软件包
- 安装Nginx
sudo apt-get install nginx
- 安装PHP5和MySQL扩展。
sudo apt-get install php5-fpm php5-mysql
- 安装MySQL服务器和客户端
sudo apt-get install mysql-server mysql-client
- 安装OpenSSH Server以允许远程连接。
sudo apt-get install openssh-server
- 安装解压缩,需要解压缩下载的WordPress文件。
sudo apt-get install unzip
授予系统管理权限
现在,我们将需要系统管理权限的帐户分配给sysadmins组。通过sudo,sysadmins组将具有完整的管理权限。然后,将为根用户提供一个非常复杂的密码,以防止滥用。
- 打开sudoers文件编辑器。
sudo visudo
- 导航到文件底部,并添加以下行:
%sysadmins ALL=(ALL) ALL
- 要保存我们的设置,请按ESC,然后键入冒号(:)和'w'。
- 输入冒号(:)和'q'退出编辑器。
- 为根帐户设置一个复杂的密码。时间越长,越复杂越好。
锁定SSH访问
SSH是远程管理Linux服务器的好工具。
- 在文本编辑器(如VI)中打开SSH服务器配置文件。
sudo vi /etc/ssh/sshd_config
- 找到允许root登录的行。
#PermitRootLogin yes
通过删除井号"#"并将"是"替换为"否"来取消注释。注意:尽管此选项已被注释掉,但默认情况下SSH会授予Root登录权限。这就是为什么我们取消注释该选项并将其显式设置为" no"很重要的原因。
PermitRootLogin no
- 现在,我们只希望授权用户通过SSH访问我们的服务器。在配置文件中添加" AllowGroup"选项,然后添加我们要允许访问的组。
AllowGroups remoteadmins
- 保存配置文件并退出编辑器。
- 重新启动SSH守护程序以应用我们的更改。
sudo service sshd restart
准备WordPress目录
在安装配置Nginx和安装WordPress之前,我们需要使用以下目录树准备我们的webapps目录。 / srv下的webapps目录将被授予权限,以允许我们的开发人员用户帐户具有读/写访问权限,而public_html目录将被授予每个人读取访问权限。
/srv |---/webapps |---/app1 |---/public_html |---/var |---/logs |---/webapps |---/app1
- 创建Web根目录
sudo mkdir -p /srv/webapps/app1/public_html
- 创建日志目录
sudo mkdir -p /var/logs/webapps/app1
- 将/ webapps组所有权更改为我们的网络管理员。
sudo chgrp -Rv webadmins /srv/webapps
- 递归设置webapps目录的guid位,以确保所有新文件和目录均由webadmins组拥有。另外,我们将授予对webadmins组和文件所有者的读/写访问权限,而不授予其他任何人的访问权限。
sudo chmod 2770 -Rv /srv/webapps
- 通过public_html目录,我们将授予所有人读取权限。
sudo chmod 2775 -Rv /srv/webapps/app1/public_html
配置MySQL服务器
- 要删除匿名用户访问并禁止Root远程连接,请运行以下命令。当提示重新加载特权表时,请记住输入" y";否则,帐户更改将不会应用。
sudo /usr/bin/mysql_secure_installation
- 登录到MySQL的控制台。
mysql -u root -p
- 为我们自己创建一个用户帐户。
CREATE USER 'jsmith'@'localhost' IDENTIFIED BY 'mypassword';
- 为帐户授予管理权限。
GRANT ALL ON *.* TO 'jsmith'@'localhost' WITH GRANT OPTION;
授予自己所有特权可能非常危险。帐户只能用于管理目的。
- 为Web应用程序创建数据库。我们的示例将针对使用名为MyWPSite的数据库的WordPress网站。
CREATE DATABASE app1;
- 我们的Web应用程序将需要一个允许其查询,添加和删除数据库中项目的帐户。我们将命名为mywpsite_service帐户,并为其分配一个相当复杂的密码。
CREATE USER 'app1_service'@'localhost' IDENTIFIED BY '2qrYzFrxcXctsHq66erd9NYBuwq4enbX';
- 现在,我们将仅向WordPress服务帐户授予其实际需要的特权。
GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,CREATE ON app1.* TO 'app1_service'@'localhost';
- 重命名MySQL Root帐户。这将防止大多数行车记录脚本命中和一些恶意用户闯入我们的数据库服务器。
RENAME USER 'root'@'localhost' TO 'new_user_name'@'localhost';
- 刷新特权表以强制应用新特权。
FLUSH PRIVILEGES;
配置PHP
- 在文本编辑器(如VI)中打开PHP的配置文件。
sudo vi /etc/php5/fpm/php.ini
- 出于安全原因,应禁用一些功能,除非我们确定Web应用程序需要这些功能。找到以下行。
disable_functions =
并替换为
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
- 找到包含选项display_errors的行,并确保将其设置为``关闭''。
display_errors = Off
- 找到包含选项register_globals的行,并确保将其设置为``off''。
register_globals = Off
- 找到包含选项
magic_quotes_gpc''的行,并确保将其设置为
off''。
magic_quotes_gpc = Off
- 保存更改并退出文本编辑器。
- 重新启动Nginx以应用新的PHP设置。
sudo service nginx restart
安装和配置WordPress
- 将最新的WordPress版本下载到主目录中。
wget http://wordpress.org/latest.zip
- 解压下载文件。
unzip latest.zip
- 将未压缩的文件复制到我们应用程序目录的public_html文件夹中。不要移动文件。需要复制以确保继承适当的权限。
cp -R ./wordpress/* /srv/webapps/app1/public_html/
- 在桌面上打开Web浏览器,然后导航到Web服务器。
- 点击
创建配置文件
按钮开始安装。 - 点击
Let'go
按钮。 - 在数据库字段中,输入我们为较早的应用程序app1创建的数据库的名称。
- 输入我们为数据库app1_service创建的服务帐户
- 输入服务帐户的密码2YzFrxcXctsHq66erd9NYBuwq4enb
- 使用默认的数据库主机字段值。
- 将表前缀更改为默认值以外的任何值。
- 点击提交。
- 如果一切顺利,请单击运行安装。
- 在网站标题字段中输入网站的名称。
- 出于安全原因,请将"用户名"值从"管理员"更改为其他名称。
- 输入用户帐户的密码。
- 输入电子邮件地址。
- 点击
安装WordPress
按钮。
安全WordPress
无论是WordPress还是其他Web应用程序,都将需要保护公众免受攻击的领域,任何管理领域都是一个很好的例子。而且,如果网站是面向公众的,则可能我们会强力阻止Web索引器对部分进行索引。
- 在文本编辑器(如VIM)中打开Nginx默认网站配置文件。
vim /etc/nginx/sites-available/default.conf
- 找到定义网站的部分。它将包含在服务器部分中,该部分以开头。
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; ...
- 找到以下行:
root /usr/share/nginx/html;
并对其进行修改,使其指向我们之前创建的目录
root /srv/webapps/app1/public_html
- 通过找到以下行,将index.php设置为索引文件名:
index index.html index.htm;
并将index.php添加到它的末尾
index index.html index.htm index.php;
- 通过查找和删除哈希标记以取消对突出显示的行的注释来启用PHP支持:
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ .php$ { # fastcgi_split_path_info ^(.+.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; # fastcgi_index index.php; # include fastcgi_params; #}
完成后,该部分应如下所示。
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
- 为了保护WordPress管理控制台不受未经授权的用户的侵害,请在服务器指令内部创建以下location指令,并修改高亮显示网络以匹配我们自己的网络。
location /wp-admin { allow 192.0.2.0/24; deny all; }
这将阻止所有非192.0.2.0/24网络的连接。修改网络地址以匹配环境。
- 保存更改并退出编辑器。
- 重新加载Nginx配置文件。
sudo service nginx reload