搭建和管理Web服务器环境是开发者的必备技能。本文将介绍从基础环境搭建到高级配置的完整流程,帮助你在本地和生产环境中快速部署可靠的服务。

Apache服务器配置

macOS上配置Apache

macOS系统自带Apache,只需简单配置即可使用。

启用PHP支持

# 1. 编辑Apache配置文件
sudo vim /etc/apache2/httpd.conf

# 2. 启用PHP模块
# 取消这行的注释:
# LoadModule php5_module libexec/apache2/libphp5.so

# 3. 保存并退出

# 4. 复制PHP配置文件
sudo cp /etc/php.ini.default /etc/php.ini

# 5. 启动Apache
sudo apachectl start

# 6. 创建软链接方便访问
ln -s /Library/WebServer/Documents ~/www

# 7. 重命名或删除默认的index.html.en

Apache控制命令

# 启动Apache
sudo apachectl start

# 停止Apache
sudo apachectl stop

# 重启Apache
sudo apachectl restart

# 查看Apache状态
sudo apachectl status

# 测试配置文件语法
sudo apachectl configtest

# 重新加载配置(不中断服务)
sudo apachectl graceful

配置虚拟主机

在CentOS或其他Linux系统上,可以在主配置文件中包含自定义配置。

# 在httpd.conf中添加
Include etc/apache22/Includes/*.conf

然后在/usr/local/etc/apache22/Includes目录下创建自己的配置文件。

示例配置1:Alias方式

# 文件:/usr/local/etc/apache22/Includes/sun.conf
Alias /~stsun /home/stsun/public_html

<Directory "/home/stsun/public_html">
    Options +Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

示例配置2:虚拟主机方式

# 虚拟主机配置
NameVirtualHost *:8080

<VirtualHost *:8080>
    DocumentRoot "/Users/sun/w"
    <Directory "/Users/sun/w">
        DirectoryIndex index.html
        AddHandler cgi-script .py .pl
        AddType text/html .py .html .pl
        Options ExecCGI
        Order Allow,Deny
        AllowOverride All
        Allow from all
    </Directory>
</VirtualHost>

重定向配置

Apache支持多种重定向方式:

# 简单重定向
Redirect 301 /old-url http://example.com/new-url

# 使用mod_rewrite
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^old-url$ /new-url [R=301,L]
</IfModule>

# HTTP到HTTPS重定向
<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

PHP环境配置

安装多个PHP版本

在开发过程中,可能需要使用不同版本的PHP。

# 在macOS上安装特定版本的PHP
curl -s http://php-osx.liip.ch/install.sh | bash -s 5.5

# 在PHPStorm中配置解释器路径
# 使用:/usr/local/php5/bin

PHP模块管理

include vs require

// include:失败时产生警告,继续执行
include 'config.php';

// require:失败时产生致命错误,停止执行
require 'config.php';

// include_once:只包含一次,避免重复定义
include_once 'functions.php';

// require_once:只包含一次,失败时停止
require_once 'classes.php';

使用建议

  • include:用于可选的非关键文件
  • require:用于必须的关键文件
  • _once后缀:在脚本执行期间同一文件可能被多次包含时使用,避免函数重定义或变量重新赋值
  • include通常放在流程控制的处理区段中,用到时加载
  • require通常放在PHP程序最前面,一开始就加载

CGI配置

在macOS上配置CGI支持:

# 1. 创建CGI目录软链接
ln -s /Library/WebServer/CGI-Executables ~/www/cgi-bin

# 2. 进入目录
cd ~/www/cgi-bin

# 3. 放置CGI脚本
# 脚本需要755权限才能执行
chmod 755 script.pl
chmod 755 script.py

# 4. 访问CGI脚本
# http://localhost/cgi-bin/filename

Apache CGI配置示例

# 在Apache配置文件中启用CGI
LoadModule cgi_module libexec/apache2/mod_cgi.so

# 配置CGI目录
<Directory "/Library/WebServer/CGI-Executables">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

# 允许.py和.pl文件作为CGI
AddHandler cgi-script .cgi .pl .py

CSS文件在CGI中的应用

当使用Perl Dancer等框架开发时,需要正确配置静态文件路径。

# 在Dancer应用中配置静态文件
set public => '/path/to/public';
set views => '/path/to/views';

# 在模板中引用CSS
<link rel="stylesheet" href="/css/style.css">

确保Apache配置允许访问静态文件:

<Directory "/path/to/public">
    Options -Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

MySQL配置

免密登录MySQL

在脚本中使用MySQL时,可以通过命令行参数传递凭据:

# 免密连接MySQL
mysql -h $host -u $user -p$pass $db

安全建议

  • 不要在脚本中硬编码密码
  • 使用配置文件存储敏感信息
  • 设置适当的文件权限(600或400)
  • 考虑使用MySQL配置文件~/.my.cnf
# ~/.my.cnf
[client]
user = your_username
password = your_password
host = localhost

用户权限管理

-- 创建用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'password';

-- 授予所有权限
GRANT ALL PRIVILEGES ON database.* TO 'appuser'@'localhost';

-- 授予特定权限
GRANT SELECT, INSERT, UPDATE, DELETE ON database.* TO 'appuser'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

-- 查看权限
SHOW GRANTS FOR 'appuser'@'localhost';

Python环境配置

pyenv多版本管理

使用pyenv可以轻松管理多个Python版本:

# 安装pyenv
brew install pyenv

# 安装Python版本
pyenv install 2.7.10
pyenv install 3.6.8

# 设置全局默认版本
pyenv global 3.6.8

# 启用多个版本(同时使用python2和python3)
pyenv global 2.7.10 3.4.3

# 设置目录特定版本
cd /path/to/project
pyenv local 3.6.8

# 查看已安装版本
pyenv versions

pipenv虚拟环境管理

pipenv是Python官方推荐的虚拟环境管理工具。

# 创建虚拟环境
mkdir myproject && cd myproject
pipenv --python 3.6

# 激活虚拟环境
pipenv shell

# 安装包
pipenv install requests
pipenv install pytest --dev

# 从requirements.txt安装
pipenv install -r requirements.txt
pipenv install --dev

# 生成requirements.txt
pip freeze > requirements.txt

# 退出虚拟环境
exit

# 删除虚拟环境
pipenv --rm

# 查看虚拟环境路径
pipenv --venv

# 手动删除虚拟环境
# 虚拟环境通常在 ~/.local/share/virtualenvs

批量更新Python包

# update_packages.py
import pip
from subprocess import call

for dist in pip.get_installed_distributions():
    call("pip install --upgrade " + dist.project_name, shell=True)

或者使用pip-review:

pip install pip-review
pip-review --auto

在不同环境中配置Python

CentOS本地安装

# 下载Python源码
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
tar xzf Python-3.6.8.tgz
cd Python-3.6.8

# 配置安装路径
./configure --prefix=$HOME/.local

# 编译安装
make && make install

# 更新PATH
export PATH=$HOME/.local/bin:$PATH

使用国内源

# 使用豆瓣源安装包
pip install -i https://pypi.douban.com/simple/ package_name

# 配置永久源
mkdir -p ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://pypi.douban.com/simple/
trusted-host = pypi.douban.com
EOF

Django开发配置

Python3环境配置

# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate

# 安装Django
pip install django

# 创建项目
django-admin startproject myproject

# 运行开发服务器
python manage.py runserver

修改页面头部

# Django Admin自定义
# admin.py
from django.contrib import admin
from .models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    list_display = ['field1', 'field2', 'field3']

admin.site.register(MyModel, MyModelAdmin)

# 修改Admin站点标题
admin.site.site_header = "My Administration"
admin.site.site_title = "My Admin Portal"
admin.site.index_title = "Welcome to My Admin Portal"

CSS文件配置问题

使用Gunicorn时CSS文件无法加载的解决方案:

# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
# 收集静态文件
python manage.py collectstatic

# Nginx配置
location /static/ {
    alias /path/to/project/staticfiles/;
}

大数据环境配置

Hive在macOS上的安装

Hive安装需要的资源:

# 参考资源
https://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration
https://cwiki.apache.org/confluence/display/Hive/GettingStarted
https://noobergeek.wordpress.com/2013/11/09/simplest-way-to-install-and-configure-hive-for-mac-osx-lion/
https://amodernstory.com/2015/03/29/installing-hive-on-mac/

关键步骤

  1. 安装Java和Hadoop
  2. 下载并解压Hive
  3. 配置环境变量
  4. 创建元数据库(通常使用MySQL)
  5. 配置hive-site.xml

Presto配置调试

# 常见问题排查
# 1. 检查配置文件语法
cat presto/config.properties

# 2. 查看日志
tail -f presto/data/var/log/presto-server.log

# 3. 测试连接
presto-cli --server localhost:8080 --catalog hive

Zeppelin配置Presto

# zeppelin-site.xml
<property>
    <name>zeppelin.interpreters</name>
    <value>...presto...</value>
</property>

# 在Zeppelin中使用Presto
%presto
select count(*) from my_table;

EMR环境配置

创建Hive超级用户

# 在EMR集群中创建Hive超级用户
# 1. SSH到主节点
ssh hadoop@master-node

# 2. 配置用户权限
sudo su hdfs
hdfs dfs -mkdir /user/username
hdfs dfs -chown username:username /user/username

# 3. 配置Hive权限
mysql -u root -p
-- 在Hive元数据库中
CREATE USER 'hiveuser'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'hiveuser'@'%';
FLUSH PRIVILEGES;

Spark文件操作

# Spark中操作文件系统
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("FileOps").getOrCreate()

# 读取文件
df = spark.read.csv("hdfs://path/to/file.csv")

# 写入文件
df.write.parquet("hdfs://path/to/output")

# 删除分区
# 使用HiveQL
spark.sql("ALTER TABLE my_table DROP IF EXISTS PARTITION (date='2020-01-01')")

Node.js环境

CentOS安装Node.js

# 使用EPEL仓库
sudo yum install epel-release
sudo yum install nodejs npm

# 或使用nvm安装
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
source ~/.bashrc
nvm install node

Scala环境配置

在Ammonite中导入第三方JAR包:

# 启动Ammonite时加载JAR
amm --cp /path/to/library.jar

# 或在REPL中加载
import $ivy.`com.example::library:1.0.0`

开发工具配置

VS Code Remote Development

VS Code Remote Development允许你在远程服务器上直接开发,就像在本地一样。

配置步骤

  1. 安装VS Code
  2. 安装Remote-SSH扩展
  3. 配置SSH连接
# ~/.ssh/config
Host aws-server
    HostName your-ec2-ip
    User ec2-user
    IdentityFile ~/.ssh/your-key.pem
  1. 连接到远程服务器
  2. 在远程环境中开发

优势

  • 直接编辑远程文件
  • 使用远程的扩展和工具
  • 完整的IDE体验
  • 无需在本地安装开发环境

Flask中使用IPython Shell

# Flask应用配置
from flask import Flask
app = Flask(__name__)

# 使用IPython shell
from flask_shell_ipython import IPythonShell
make_ipython_shell_context_processor(app)

# 在模板中使用
{{ get_ipython() }}

# 或使用Flask-Script
from flask_script import Manager, Shell
manager = Manager(app)

def make_context():
    return dict(app=app)

manager.add_command("shell", Shell(make_context=make_context))

系统维护

tmux配置

解决权限错误

# tmux创建socket失败
tmux: can't create socket: Permission denied

# 解决方案1:删除旧socket
rm /tmp/tmux-*/default

# 解决方案2:检查libevent版本
ldconfig -p | grep libevent

# 重新安装tmux和libevent

配置文件

# ~/.tmux.conf
# 设置默认终端
set -g default-terminal "screen-256color"

# 设置前缀键为Ctrl-a
unbind C-b
set -g prefix C-a

# 启用鼠标支持
set -g mouse on

# 窗口和面板编号从1开始
set -g base-index 1
setw -g pane-base-index 1

Emacs配置

# macOS上快速配置Emacs
# 安装
brew install emacs

# 基本配置
cat > ~/.emacs << EOF
(package-initialize)
(tool-bar-mode -1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(show-paren-mode 1)
(setq inhibit-startup-screen t)
(global-linum-mode 1)
EOF

性能优化

查看内存占用

# 查看整体内存使用
free -h

# 查看进程内存占用
ps aux --sort=-%mem | head

# 查看详细内存信息
cat /proc/meminfo

# 使用top命令实时监控
top

Linux命令提示

# ln命令使用备忘
# 创建软链接
ln -s /path/to/source /path/to/link

# 创建硬链接
ln /path/to/source /path/to/link

# 强制创建
ln -sf /path/to/source /path/to/link

故障排查

包管理问题

# Ubuntu重新配置部分安装的包
sudo dpkg --configure -a

# 删除过时的包
sudo apt-get autoremove

# 修复损坏的依赖
sudo apt-get -f install

编译问题

# 安装tmux时libevent未找到
# 先安装libevent开发包
sudo yum install libevent-devel
# 或
sudo apt-get install libevent-dev

# 然后重新编译安装tmux

小结

系统管理和环境配置是每个开发者必须掌握的技能。本文涵盖了:

  1. Web服务器配置:Apache、PHP、CGI设置
  2. 数据库配置:MySQL用户管理和安全配置
  3. Python环境:多版本管理、虚拟环境、包管理
  4. 大数据工具:Hive、Presto、Spark配置
  5. 开发工具:VS Code Remote、Emacs、tmux
  6. 故障排查:常见问题的解决方案

掌握这些配置技巧,你就能在各种环境中快速搭建和部署应用。记住这些关键配置,根据自己的需求进行调整,你会发现环境配置其实并不复杂。